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 :)

JoeBrown
sumber
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.

Gareth McCaughan
sumber
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):

Brian Driscoll
sumber
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!

Daniel Lidström
sumber
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
}
scottyab
sumber
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);
}
maSC0d3R
sumber
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)
Pirijan
sumber
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).

Adarsha
sumber
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;
}
bitmous
sumber
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)
Chris
sumber
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;
}
}
Gewure
sumber
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)
jsta
sumber
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
Noby Fujioka
sumber
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]))
Pratik
sumber