円内の点の位置を計算する


88

現時点では、これについて少し頭がおかしいです。すべての点が中心から、そして互いに等距離にあると仮定して、中心点の周りの点の位置を計算する必要があるという問題があります。

ポイントの数は可変なのでDrawCirclePoints(int x) 、簡単な解決策があると確信していますが、私の人生では、それを見ることができません:)


1
誰もが素晴らしく素早い答えを出したので、私は最初の応答にチェックを入れました:)それらはすべて素晴らしかったです:)
JoeBrown 2011年

回答:


74

中心とする円上の角度θにおける点(x0,y0)と半径です。ここで、0から2piの間に等間隔の値を選択します。r(x0 + r cos theta, y0 + r sin theta)theta


古典的な質問-円周率3.14または180の値ですか?(つまり、角度は度またはラジアンですか?)
nirvanaswap 2017年

間違いなくラジアン。度を使用する場合は、代わりに0〜360の角度が必要です。
Gareth McCaughan 2017年

8
(もちろん、角度の書き方に関係なく、円周率の値は3.14ishです。それが何であるかです。)
Gareth McCaughan 2017年

89

半径の長さrと角度tをラジアンと円の中心(h、k)で指定すると、円周上の点の座標を次のように計算できます(これは擬似コードであり、次のように適合させる必要があります。言語):


cosを反転しました。sin関数は、xの場合はsin、yの場合はcosである必要があります。その逆ではありません。
アンドレアス

18
私の数学の学位、およびここにある他のすべての答えは、あなたが間違っていると言っています。
Brian Driscoll 2014年

2
うーん..スウェーデン語版ウィキペディアでは、sinはx軸であると書かれていますが、これは安全なソースではないことはわかっていますが、xでsinを使用し、yでcosを使用してキューブが正しい方向に動き始めました。私の数学の先生でさえ、私がそれらをひっくり返したと指摘しました。私の立方体がターゲットの場所から奇妙なパターンで移動し、それを裏返してその位置に移動する他の理由を考えられますか?
アンドレアス

これは私が書いたコードです。なぜそれが反転して動作するのかわかるでしょうか?jsfiddle.net/Lf5sZ
アンドレアス

3
画面座標では、正のy軸が逆になっているため、意味があります。
Brian Driscoll 2014

52

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に依存しています。ユーザーが親指を動かすと、選択した進行状況を示す画像を配置したいと思います。ポイントを少し外してみましたが、
完璧で

1
完璧です、ありがとう!まさに私が探していたもの。
PatrickHund20年

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の回答のコーヒースクリプトバージョンを次に示します。

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

完成させるために、「中心点の周りの点の位置(すべてが中心から等距離にあると仮定)」と表現するのは「極座標」に他なりません。そして、あなたは、として与えられる極座標とデカルト座標の間で変換する方法を求めています。x = r*cos(t)y = r*sin(t)


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
ジェイソン

1

各ポイント間の角度は次のようになります。2Pi/xしたがって、ポイントn= 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

これが、JavaScriptを使用して円上の点を見つけ、円の上部からの角度(度)を計算する方法です。

  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

ダニエルからの上記の回答に基づいて、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.