2009-05-08 4 views
185

Wie kann die folgende Funktion in verschiedenen Sprachen implementiert werden?Wie berechne ich einen Punkt auf dem Kreisumfang?

Berechne den (x,y) Punkt auf dem Umfang eines Kreises, gegebene Eingabewerte:

  • Radius
  • Winkel
  • Origin (optionale Parameter, wenn sie von der Sprache unterstützt)
+2

Unwahrscheinlich, @Binary, da er eine Antwort geschrieben. Dies ist eine der selbst beantworteten Fragen (die laut früheren Mitteilungen der Moderatoren erlaubt sind). Aber da es bereits in http://stackoverflow.com/questions/674225/calculating-point-on-a-circles-compcumference-from-angle-in-c beantwortet wurde, ist es wahrscheinlich am besten als Dupe geschlossen. Die Sprachen, die das tun, werden nicht so unterschiedlich sein. – paxdiablo

+21

Ich habe gerade eingeloggt, um das zu sagen: Sie, Sir (Rook), sind ein Idiot. Nicht jeder hat das gleiche Bildungsniveau wie du, kannst aber immer noch programmieren, also ist das keine triviale Code Golffrage. Schäm dich. – Braineeee

Antwort

468

Die parametric equation for a circle ist

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

Wo r der Radius, cx, cy der Ursprung, und a der Winkel.

Das ist ziemlich einfach, mit grundlegenden trigonometrischen Funktionen in jede Sprache anzupassen. Beachten Sie, dass die meisten Sprachen radians für den Winkel in trigonometrischen Funktionen verwenden, also statt durch 0.360 Grad radeln Sie durch 0..2PI Radianten.

+74

Beachten Sie, dass 'a' im Bogenmaß sein muss - das war wirklich schwer für mich als Anfänger zu verstehen. – ioanb7

+8

Ich habe versucht, diese Gleichung jetzt für eine Stunde abzuleiten. Vielen Dank. Wer die trigiden Identitäten kennt, die Sie in der High School gelernt haben, wäre so hilfreich. –

+1

@Dean Aufgrund der Vorrangstellung des Bedieners sind keine zusätzlichen Klammern erforderlich. Wenn Sie '+' und '*' wie in diesen beiden Gleichungen haben und ohne Klammern, gehen Sie immer für das '*' zuerst und dann für das '+'. – rbaleksandar

43

Hier ist meine Implementierung in 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

Berechnen Sie den Umrechnungsfaktor so vor, dass die Wahrscheinlichkeit einer falschen Eingabe der Konvertierung mit fest codierten Zahlen geringer ist. –

16

Wer trig benötigt, wenn Sie haben 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

Wie funktioniert das? Wie vergleicht es die Geschwindigkeit? Warum wird das nicht häufiger verwendet? –

+0

@ MarkA.Ropper Wie funktionieren komplexe Zahlen? - Suchen Sie ein Mathe-Tutorial oder gehen Sie von https://en.wikipedia.org/wiki/Euler%27s_identity, wenn Sie bereits wissen, was eine komplexe Zahl ist. Es ist wahrscheinlich nicht so effizient in der Geschwindigkeit verglichen mit der Implementierung von sin als Nachschlagetabelle, aber manchmal verwenden Sie komplexe Zahlen, um Punkte darzustellen, um andere Eigenschaften von ihnen auszuwerten. Ähnlich wie bei der Verwendung von Quaternionen für 3D-Rotationen ist es nicht die Geschwindigkeit, sondern die Fähigkeiten, die sie dir geben. –