W tej chwili mam trochę pustki w tej sprawie. Mam problem polegający na tym, że muszę obliczyć położenie punktów wokół centralnego punktu, zakładając, że wszystkie są jednakowo oddalone od środka i od siebie.
Liczba punktów jest zmienna, więc DrawCirclePoints(int x)
jestem pewien, że istnieje proste rozwiązanie, ale do końca życia po prostu go nie widzę :)
algorithm
math
trigonometry
geometry
JoeBrown
źródło
źródło
Odpowiedzi:
Punkt pod kątem theta na okręgu, którego środek jest
(x0,y0)
i którego promieńr
wynosi(x0 + r cos theta, y0 + r sin theta)
. Teraz wybierztheta
wartości w równych odstępach od 0 do 2pi.źródło
Biorąc pod uwagę długość promienia r i kąt t w radianach oraz środek koła (h, k) , możesz obliczyć współrzędne punktu na obwodzie w następujący sposób (jest to pseudokod, musisz dostosować go do swojego język):
float x = r*cos(t) + h; float y = r*sin(t) + k;
źródło
Oto rozwiązanie wykorzystujące 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); } }
Przykładowe dane wyjściowe z
DrawCirclePoints(8, 10, new Point(0,0));
:Powodzenia!
źródło
Bazując na jednej z powyższych odpowiedzi, oto przykład 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 }
źródło
Umieszczanie liczby na ścieżce kołowej
// 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); }
źródło
Musiałem to zrobić w Internecie, więc oto wersja Coffeescript odpowiedzi @ scottyab powyżej:
źródło
Rozwiązanie 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; }
źródło
$newx
i$newy
, wprowadzanie współrzędnych drogę na zewnątrz promienia okręgu. Spróbuj$newx = (int)($center->getX() + ($radius * cos($angle)));
i podobnie dla$newy
.W celu zakończenia, to, co opisujesz jako „położenie punktów wokół punktu centralnego (zakładając, że wszystkie są w równej odległości od środka)” to nic innego jak „współrzędne biegunowe”. I prosisz o drodze do konwersji pomiędzy biegunowych i współrzędnych kartezjańskich , który jest podawany jako
x = r*cos(t)
,y = r*sin(t)
.źródło
Kąt między każdym z twoich punktów będzie
2Pi/x
taki, że możesz powiedzieć, że dla punktówn= 0 to x-1
kąt od zdefiniowanego punktu 0 wynosi2nPi/x
.Zakładając, że pierwszy punkt znajduje się w
(r,0)
(gdzie r jest odległością od środka), wówczas pozycje względem punktu centralnego będą wyglądać następująco:źródło
Działające rozwiązanie w Javie:
źródło
Oto
R
wersja oparta na powyższej odpowiedzi @Pirijan.źródło
Oto jak znalazłem punkt na okręgu za pomocą javascript, obliczając kąt (stopień) od góry koła.
źródło
W oparciu o powyższą odpowiedź od Daniela, oto moje podejście do korzystania z Python3.
źródło