Вычисление положения точек в окружности
У меня есть немного пустой ум на этот момент.
У меня есть проблема, когда мне нужно вычислить положение точек вокруг центральной точки, предполагая, что все они равноудалены от центра и друг от друга.
количество точек является переменной, так что это DrawCirclePoints(int x)
Я уверен, что есть простое решение, но для жизни меня, я просто не вижу его:)
11 ответов:
точка под углом тета на окружности, центр которой
(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 }
Я должен был сделать это в интернете, так что вот версия coffeescript @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)
решение на 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; }
для завершения то, что вы описываете как "положение точек вокруг центральной точки(предполагая, что все они равноудалены от центра)" - это не что иное, как "полярные координаты". И вы просите способ преобразования между полярными и Декартовыми координатами, которая дается как
x = r*cos(t),y = r*sin(t).
рабочее решение на 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; } }
здесь
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]))
Comments