Вычисление положения точек в круге

На данный момент у меня немного ума. У меня проблема, когда мне нужно рассчитать положение точек вокруг центральной точки, предполагая, что все они равноудалены от центра и друг от друга.

Количество точек является переменным, поэтому DrawCirclePoints(int x) Я уверен, что есть простое решение, но для жизни меня я просто не вижу этого 🙂

Точка на угол тета на окружности, центр которой (x0,y0) и радиус которой равен r равен (x0 + r cos theta, y0 + r sin theta) . Теперь выберите значения theta равномерно распределенные между 0 и 2pi.

Учитывая длину радиуса r и угол t в радианах и центр круга (h, k) , вы можете вычислить координаты точки по окружности следующим образом (это псевдокод, вам придется адаптировать его к вашему язык):

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

Вот решение, использующее 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} 

Удачи!

Используя один из вышеуказанных ответов в качестве базы, вот пример 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 на 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) 

Решение 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; } 

Рабочее решение в 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; } } 

Ради завершения, то, что вы описываете как «положение точек вокруг центральной точки (при условии, что все они равноудалены от центра)» – это не что иное, как «полярные координаты». И вы просите путь к преобразованию между полярными и декартовыми координатами, которые задаются как x = r cos (t), y = r sin (t).

Вот версия 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) 

Угол между каждой из ваших точек будет 2Pi/x поэтому вы можете сказать, что для точек n= 0 to x-1 угол от заданной 0 точки равен 2nPi/x .

Предполагая, что ваша первая точка находится в точке (r,0) (где r – расстояние от центральной точки), тогда позиции относительно центральной точки будут:

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

Основываясь на ответе выше от Дэниела, вот мой прием с использованием Python3.

 import numpy shape = [] def circlepoints(points,radius,center): 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])) 
Давайте будем гением компьютера.