У меня сейчас немного пустого ума по этому поводу. У меня проблема, когда мне нужно вычислить положение точек вокруг центральной точки, предполагая, что все они равноудалены от центра и друг от друга.
Количество баллов варьируется, поэтому DrawCirclePoints(int x)
я уверен, что есть простое решение, но, черт возьми, я его просто не вижу :)
algorithm
math
trigonometry
geometry
ДжоБраун
источник
источник
Ответы:
Точка под углом тета на окружности, центр которой равен,
(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));
:Удачи!
источник
Используя один из приведенных выше ответов в качестве основы, вот пример 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 }
источник
Размещение числа по круговой траектории
// 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); }
источник
Мне пришлось сделать это в Интернете, поэтому вот версия ответа @scottyab выше на кофе :
источник
Решение 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
.Для полноты, то, что вы описываете как «положение точек вокруг центральной точки (при условии, что все они равноудалены от центра)» - это не что иное, как «Полярные координаты». И вы просите пути преобразования между полярными и декартовыми координатами , которые даются , как
x = r*cos(t)
,y = r*sin(t)
.источник
Угол между каждой из ваших точек будет
2Pi/x
таким, чтобы вы могли сказать, что для точекn= 0 to x-1
угол от определенной нулевой точки равен2nPi/x
.Предполагая, что ваша первая точка находится в
(r,0)
(где r - расстояние от центральной точки), тогда позиции относительно центральной точки будут:источник
Рабочее решение на Java:
источник
Вот
R
версия, основанная на ответе @Pirijan выше.источник
Вот как я нашел точку на окружности с помощью javascript, вычислив угол (градус) от вершины круга.
источник
Основываясь на ответе Дэниела выше, вот мой вариант использования Python3.
источник