원에서 점의 위치 계산


87

나는 현재 이것에 대해 약간의 마음이 비어 있습니다. 중심점 주변의 점 위치를 계산해야하는 문제가 있는데, 중심점과 서로 등거리에 있다고 가정합니다.

포인트 수는 가변적이므로 DrawCirclePoints(int x) 간단한 해결책이 있다고 확신하지만 제 삶을 위해 볼 수 없습니다 :)


1
나는 그들이 모두 훌륭한 :)했다 최초의 응답 :에 틱 준, 그래서 모든 사람은 큰 응답, 미친 빠른했다
JoeBrown

답변:


72

중심이 (x0,y0)이고 반지름이 인 원의 각도 세타에있는 점 r입니다 (x0 + r cos theta, y0 + r sin theta). 이제 theta0에서 2pi 사이의 균등 한 간격으로 값을 선택 합니다.


고전적인 질문은 파이 3.14 또는 180의 값입니까? (즉 ℃, 또는 라디안에서 각도는?)
nirvanaswap

확실히 라디안. 각도를 사용하는 경우 대신 0에서 360 사이의 각도가 필요합니다.
Gareth McCaughan

7
(PI의 값은 3.14ish 상관없이 당신은 물론, 쓰기 각도로 선호하는 방법입니다 그것은 그것이 무엇이다..)
가레스 McCaughan

87

반경 길이 r 과 각도 t (라디안)와 원의 중심 (h, k)이 주어지면 다음과 같이 원주에있는 점의 좌표를 계산할 수 있습니다 (이는 의사 코드입니다. 언어):

float x = r*cos(t) + h;
float y = r*sin(t) + k;

당신은 cos를 뒤집었고 sin 함수는 x의 경우 sin이고 y의 경우 cos 여야합니다. 그 반대는 아닙니다.
Andreas

18
나의 수학 학위와 다른 모든 대답은 당신이 틀렸다고 말합니다.
Brian Driscoll

2
흠 .. 스웨덴 위키 백과에서 sin은 x 축이라고 말합니다. 이것이 안전한 소스가 아니라는 것을 알고 있지만 x에 sin을 사용하고 y에 cos를 사용하여 큐브가 올바른 방향으로 움직이기 시작했습니다. 심지어 수학 선생님도 내가 뒤집 었다고 지적했습니다. 내 큐브가 대상 위치에서 멀어지는 이상한 패턴으로 움직이는 다른 이유를 생각할 수 있습니까?
Andreas

이것이 내가 작성한 코드입니다. 왜 뒤집혀서 작동하는지 알 수 있습니까? jsfiddle.net/Lf5sZ
안드레아스

3
화면 좌표에서 양의 y 축이 반전되므로 의미가 있습니다.
Brian Driscoll 2014

51

다음은 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);
    }
}

의 샘플 출력 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}

행운을 빕니다!


1
우수한! 나를 위해 훌륭하게 일했고 이미 php-cairo로 번역했고 훌륭하게 작동했습니다!
Melsi 2013 년

같은 종류의 작업을하려고하는데 내 것이 Triggertrap / SeekArc · GitHub에 의존하고 있습니다. 사용자가 엄지 손가락을 움직일 때 이미지를 배치하여 선택한 사람의 진행 상황을 표시하고 싶습니다. 나에게 포인트를 조금 떼어 내고
완벽

9

위 답변 중 하나를 기본으로 사용하여 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

원형 경로에 숫자 배치

// 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

웹에서이 작업을 수행해야했기 때문에 위 의 @ scottyab 답변 coffeescript 버전이 있습니다 .

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

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;
}

나는 괄호에 대한 잘못된 생각 $newx$newy좌표 두는 방법을 원 반경 밖에. 시도 $newx = (int)($center->getX() + ($radius * cos($angle)));하고 $newy.
제이슨

2

완성을 위해 "중심점 주변의 점 위치 (중심에서 모두 등거리에 있다고 가정)"라고 설명하는 것은 "극좌표"일뿐입니다. 그리고 당신에게 방법을 요구하는 극과 직교 좌표 사이의 변환 로 제공됩니다 x = r*cos(t), y = r*sin(t).


1

각 점 사이의 각도는 2Pi/xn= 0 to x-1에 대해 정의 된 0 점으로부터의 각도가 다음과 같다고 말할 수 있습니다.2nPi/x .

첫 번째 점이 (r,0)(여기서 r은 중심점으로부터의 거리)에 있다고 가정하면 중심점과 관련된 위치는 다음과 같습니다.

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

1

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

R위의 @Pirijan 답변을 기반으로 한 버전입니다.

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

다음은 원의 상단에서 각도 (도)를 계산하여 자바 스크립트로 원의 한 점을 찾은 방법입니다.

  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

위의 Daniel의 답변을 바탕으로 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]))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.