Menghitung posisi titik dalam lingkaran


88

Saya memiliki sedikit pikiran kosong tentang ini saat ini. Saya punya masalah di mana saya perlu menghitung posisi titik di sekitar titik pusat, dengan asumsi semuanya berjarak sama dari pusat dan dari satu sama lain.

Jumlah poin bervariasi jadi DrawCirclePoints(int x) saya yakin ada solusi sederhana, tetapi untuk kehidupan saya, saya tidak bisa melihatnya :)


1
Semua orang memberikan jawaban yang bagus, cepat gila, jadi saya memberikan centang pada tanggapan pertama :) Mereka semua hebat :)
JoeBrown

Jawaban:


74

Titik pada sudut theta pada lingkaran yang pusatnya (x0,y0)dan jari-jarinya radalah (x0 + r cos theta, y0 + r sin theta). Sekarang pilih thetanilai-nilai yang berjarak antara 0 dan 2pi.


Pertanyaan klasik- adalah nilai pi 3,14 atau 180? (yaitu sudut dalam derajat atau radian?)
nirvanaswap

Pastinya radian. Jika Anda menggunakan derajat, Anda membutuhkan sudut antara 0 dan 360.
Gareth McCaughan

8
(Nilai pi adalah 3,14, terlepas dari bagaimana Anda lebih suka menulis sudut, tentu saja. Memang seperti itu.)
Gareth McCaughan

88

Diketahui panjang jari-jari r dan sudut t dalam radian dan pusat lingkaran (h, k) , Anda dapat menghitung koordinat titik pada keliling sebagai berikut (ini adalah pseudo-code, Anda harus menyesuaikannya dengan bahasa):


Anda telah membalik fungsi cos dan sin harus sin untuk x dan cos untuk y. Bukan sebaliknya.
Andreas

18
Gelar saya dalam matematika, serta setiap jawaban lainnya di sini, mengatakan Anda salah.
Brian Driscoll

2
Hm .. baik di wikipedia swedia dikatakan sin adalah sumbu x Saya tahu ini bukan sumber yang aman tetapi kemudian saya menggunakan sin pada x dan cos pada y kubus saya mulai bergerak ke arah yang benar. Bahkan guru matematika saya menunjukkan bahwa saya membaliknya. Dapatkah Anda memikirkan alasan lain mengapa kubus saya akan bergerak dalam pola yang aneh menjauh dari lokasi target dan kemudian saya membaliknya sehingga pindah ke posisinya?
Andreas

Ini adalah kode yang saya tulis, mungkin Anda bisa tahu mengapa itu bekerja dengan mereka membalik? jsfiddle.net/Lf5sZ
Andreas

3
Di layar koordinat sumbu y positif dibalik, jadi itu masuk akal.
Brian Driscoll

52

Berikut solusi menggunakan C #:

void DrawCirclePoints(int points, double radius, Point center)
{
    double slice = 2 * Math.PI / points;
    for (int i = 0; i < points; i++)
    {
        double angle = slice * i;
        int newX = (int)(center.X + radius * Math.Cos(angle));
        int newY = (int)(center.Y + radius * Math.Sin(angle));
        Point p = new Point(newX, newY);
        Console.WriteLine(p);
    }
}

Contoh keluaran dari DrawCirclePoints(8, 10, new Point(0,0));:

{X=10,Y=0}
{X=7,Y=7}
{X=0,Y=10}
{X=-7,Y=7}
{X=-10,Y=0}
{X=-7,Y=-7}
{X=0,Y=-10}
{X=7,Y=-7}

Semoga berhasil!


1
Luar biasa! Berhasil untuk saya, saya sudah menerjemahkannya ke php-cairo dan bekerja dengan baik!
Melsi

Saya ingin melakukan jenis tugas yang sama, namun tugas saya bergantung pada Triggertrap / SeekArc · GitHub, ketika pengguna menggerakkan ibu jari, saya ingin menempatkan gambar untuk menunjukkan kemajuan yang dipilih dari orang tersebut .... semua yang saya miliki mencoba memberi saya poin sedikit dan tidak sempurna
Ruyonga Dan

1
Sempurna, terima kasih! Hanya apa yang saya cari.
Patrick Hund

9

Menggunakan salah satu jawaban di atas sebagai basis, berikut adalah contoh Java / Android:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    RectF bounds = new RectF(canvas.getClipBounds());
    float centerX = bounds.centerX();
    float centerY = bounds.centerY();

    float angleDeg = 90f;
    float radius = 20f

    float xPos = radius * (float)Math.cos(Math.toRadians(angleDeg)) + centerX;
    float yPos = radius * (float)Math.sin(Math.toRadians(angleDeg)) + centerY;

    //draw my point at xPos/yPos
}

4

Menempatkan angka di jalur melingkar

// variable

let number = 12; // how many number to be placed
let size = 260; // size of circle i.e. w = h = 260
let cx= size/2; // center of x(in a circle)
let cy = size/2; // center of y(in a circle)
let r = size/2; // radius of a circle

for(let i=1; i<=number; i++) {
  let ang = i*(Math.PI/(number/2));
  let left = cx + (r*Math.cos(ang));
  let top = cy + (r*Math.sin(ang));
  console.log("top: ", top, ", left: ", left);
}

3

Saya harus melakukan ini di web, jadi inilah versi coffeescript dari jawaban @ scottyab di atas:

points = 8
radius = 10
center = {x: 0, y: 0}

drawCirclePoints = (points, radius, center) ->
  slice = 2 * Math.PI / points
  for i in [0...points]
    angle = slice * i
    newX = center.x + radius * Math.cos(angle)
    newY = center.y + radius * Math.sin(angle)
    point = {x: newX, y: newY}
    console.log point

drawCirclePoints(points, radius, center)

3

Demi penyelesaian, apa yang Anda gambarkan sebagai "posisi titik di sekitar titik pusat (dengan asumsi semuanya berjarak sama dari pusat)" tidak lain adalah "Koordinat Kutub". Dan Anda meminta cara untuk Convert antara koordinat polar dan Cartesian yang diberikan sebagai x = r*cos(t), y = r*sin(t).


3

Solusi PHP:

class point{
    private $x = 0;
    private $y = 0;
    public function setX($xpos){
        $this->x = $xpos;
    }
    public function setY($ypos){
        $this->y = $ypos;
    }
    public function getX(){
        return $this->x;
    }
    public function getY(){
        return $this->y;
    }
    public function printX(){
        echo $this->x;
    }
    public function printY(){
        echo $this->y;
    }
}
function drawCirclePoints($points, $radius, &$center){
    $pointarray = array();
    $slice = (2*pi())/$points;
    for($i=0;$i<$points;$i++){
        $angle = $slice*$i;
        $newx = (int)($center->getX() + ($radius * cos($angle)));
        $newy = (int)($center->getY() + ($radius * sin($angle)));
        $point = new point();
        $point->setX($newx);
        $point->setY($newy);
        array_push($pointarray,$point);
    }
    return $pointarray;
}

Saya yakin tanda kurung salah untuk $newxdan $newy, meletakkan koordinat jauh di luar radius lingkaran. Coba $newx = (int)($center->getX() + ($radius * cos($angle)));dan serupa untuk $newy.
Jason

1

Sudut antara masing-masing titik Anda akan menjadi 2Pi/xsehingga Anda dapat mengatakan bahwa untuk titik n= 0 to x-1sudut dari titik 0 yang ditentukan adalah 2nPi/x.

Dengan asumsi titik pertama Anda berada di (r,0)( di mana r adalah jarak dari titik pusat) maka posisi relatif terhadap titik pusat adalah:

rCos(2nPi/x),rSin(2nPi/x)

1

Solusi Kerja di Java:

import java.awt.event.*;
import java.awt.Robot;

public class CircleMouse {

/* circle stuff */
final static int RADIUS = 100;
final static int XSTART = 500;
final static int YSTART = 500;
final static int DELAYMS = 1;
final static int ROUNDS = 5;

public static void main(String args[]) {

    long startT = System.currentTimeMillis();
    Robot bot = null;

    try {
        bot = new Robot();
    } catch (Exception failed) {
        System.err.println("Failed instantiating Robot: " + failed);
    }
    int mask = InputEvent.BUTTON1_DOWN_MASK;

    int howMany = 360 * ROUNDS;
    while (howMany > 0) {
        int x = getX(howMany);
        int y = getY(howMany);
        bot.mouseMove(x, y);
        bot.delay(DELAYMS);
        System.out.println("x:" + x + " y:" + y);
        howMany--;
    }

    long endT = System.currentTimeMillis();
    System.out.println("Duration: " + (endT - startT));

}

/**
 * 
 * @param angle
 *            in degree
 * @return
 */
private static int getX(int angle) {
    double radians = Math.toRadians(angle);
    Double x = RADIUS * Math.cos(radians) + XSTART;
    int result = x.intValue();

    return result;
}

/**
 * 
 * @param angle
 *            in degree
 * @return
 */
private static int getY(int angle) {
    double radians = Math.toRadians(angle);
    Double y = RADIUS * Math.sin(radians) + YSTART;
    int result = y.intValue();

    return result;
}
}

1

Ini adalah Rversi berdasarkan jawaban @Pirijan di atas.

points <- 8
radius <- 10
center_x <- 5
center_y <- 5

drawCirclePoints <- function(points, radius, center_x, center_y) {
  slice <- 2 * pi / points
  angle <- slice * seq(0, points, by = 1)

  newX <- center_x + radius * cos(angle)
  newY <- center_y + radius * sin(angle)

  plot(newX, newY)
}

drawCirclePoints(points, radius, center_x, center_y)

1

Berikut adalah cara saya menemukan titik pada lingkaran dengan javascript, menghitung sudut (derajat) dari atas lingkaran.

  const centreX = 50; // centre x of circle
  const centreY = 50; // centre y of circle
  const r = 20; // radius
  const angleDeg = 45; // degree in angle from top
  const radians = angleDeg * (Math.PI/180);
  const pointY = centreY - (Math.cos(radians) * r); // specific point y on the circle for the angle
  const pointX = centreX + (Math.sin(radians) * r); // specific point x on the circle for the angle

0

Berdasarkan jawaban dari Daniel di atas, inilah pendapat saya menggunakan Python3.

import numpy


def circlepoints(points,radius,center):
    shape = []
    slice = 2 * 3.14 / points
    for i in range(points):
        angle = slice * i
        new_x = center[0] + radius*numpy.cos(angle)
        new_y = center[1] + radius*numpy.sin(angle)

        p = (new_x,new_y)
        shape.append(p)

    return shape

print(circlepoints(100,20,[0,0]))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.