2009-05-08 17 views
185

W jaki sposób można zaimplementować następujące funkcje w różnych językach?Jak obliczyć punkt na obwodzie koła?

wyznaczenia punktu (x,y) na obwodzie koła, podane wartości wejściowe:

  • promienia
  • kąt
  • pochodzenia (opcjonalny parametr być obsługiwana przez język)
+2

nieprawdopodobne @Binary, skoro pisał odpowiedź. Jest to jedno z pytań, na które można odpowiedzieć (zgodnie z wcześniejszymi komunikatami moderatorów). Ale biorąc pod uwagę odpowiedź na http://stackoverflow.com/questions/674225/calculating-point-on-a-circles-circumference-from-angle-in-c, prawdopodobnie najlepiej zamknąć jako dupe. Języki, które to robią, nie będą tak rozbieżne. – paxdiablo

+21

Po prostu zalogowałem się, aby powiedzieć to: ty sir (Rook) jesteś Jerkiem. Nie każdy ma taki sam poziom wykształcenia jak ty, ale może nadal kodować, więc nie jest to trywialne pytanie dotyczące golfa. Wstydź się. – Braineeee

Odpowiedz

468

parametric equation for a circle jest

x = cx + r * cos(a) 
y = cy + r * sin(a) 

przypadku R jest promieniem, cx Cy pochodzenie i kąt.

Łatwo to dopasować do dowolnego języka z podstawowymi funkcjami wyzwalania. Pamiętaj, że większość języków będzie używać radians dla funkcji kąta w trykcji, więc zamiast przechodzić przez 0..360 stopni, przejeżdżasz przez radiatory 0..2PI.

+74

Zauważ, że 'a' musi być w radianach - to było naprawdę trudne dla mnie jako początkującego. – ioanb7

+8

Próbuję wyprowadzić to równanie przez godzinę. Dzięki. Kto będzie wiedział, jakie to triki wyuczycie się w liceum, byłby tak pomocny. –

+1

@Dean Nie ma potrzeby stosowania dodatkowych nawiasów ze względu na pierwszeństwo operatora. Kiedy masz '+' i '*' jak w tych dwóch równaniach i bez nawiasów, zawsze najpierw wybierasz '*', a następnie '+'. – rbaleksandar

43

Oto moje wdrożenie w języku C#:

public static PointF PointOnCircle(float radius, float angleInDegrees, PointF origin) 
    { 
     // Convert from degrees to radians via multiplication by PI/180   
     float x = (float)(radius * Math.Cos(angleInDegrees * Math.PI/180F)) + origin.X; 
     float y = (float)(radius * Math.Sin(angleInDegrees * Math.PI/180F)) + origin.Y; 

     return new PointF(x, y); 
    } 
+5

Wstępnie oblicz współczynnik konwersji, aby zmniejszyć prawdopodobieństwo błędnej konwersji przy użyciu zakodowanych liczb. –

16

Kto potrzebuje wymuskany gdy masz complex numbers:

#include <complex.h> 
#include <math.h> 

#define PI  3.14159265358979323846 

typedef complex double Point; 

Point point_on_circle (double radius, double angle_in_degrees, Point centre) 
{ 
    return centre + radius * cexp (PI * I * (angle_in_degrees/180.0)); 
} 
+0

Jak to działa? Jak porównać prędkość? Dlaczego nie jest to częściej używane? –

+0

@ MarkA.Ropper jak działają liczby zespolone? - przejrzyj samouczek matematyczny lub przejdź z https://en.wikipedia.org/wiki/Euler%27s_identity, jeśli wiesz już, co to jest liczba zespolona. Prawdopodobnie nie jest tak wydajna pod względem szybkości, jak mówienie o wprowadzaniu grzechu jako tabeli przeglądowej, ale czasami używasz liczb zespolonych do reprezentowania punktów w celu wykorzystania innych właściwości ich. Podobnie jak w przypadku kwaternionów do rotacji 3D, tak naprawdę nie jest to szybkość, ale możliwości, które ci dają. –

Powiązane problemy