2009-05-08 19 views
185

Come può essere implementata la seguente funzione in varie lingue?Come si calcola un punto sulla circonferenza di un cerchio?

calcolare il punto (x,y) sulla circonferenza di un cerchio, dato valori di ingresso:

  • Raggio
  • dall'alto
  • originaria (parametro opzionale, se supportati dal linguaggio)
+2

Improbabile, @Binary, dal momento che ha inviato una risposta. Questa è una delle domande auto-risposte (che sono consentite, secondo le precedenti comunicazioni dei moderatori). Ma dato che era già stato risposto in http://stackoverflow.com/questions/674225/calculating-point-on-a-circles-circumference-from-angle-in-c, probabilmente è meglio chiuderlo come un dupe. Le lingue che fanno questo non saranno così disparate. – paxdiablo

+21

Ho appena effettuato il login per dire questo: tu signore (Rook) sei un Jerk. Non tutti hanno lo stesso livello di istruzione di te, ma possono ancora programmare, quindi non è una domanda banale di golf. Vergognatevi. – Braineeee

risposta

468

Il parametric equation for a circle è

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

Dove r è il raggio, cx, cy l'origine e un l'angolo.

È molto semplice adattarsi a qualsiasi linguaggio con funzioni trigonometriche di base. Si noti che la maggior parte delle lingue utilizza lo radians per l'angolo nelle funzioni trigonometriche, quindi, anziché passare da 0,360 gradi, si passa ciclicamente a radiazioni da 0..2PI.

+74

Nota che 'a' deve essere in radianti - è stato davvero difficile per me da principiante capire. – ioanb7

+8

Ho cercato di ricavare questa equazione per un'ora ora. Grazie. Chi conosce le identità trigonomiche che hai imparato alle superiori sarebbe così utile. –

+1

@Dean Non c'è bisogno di parentesi aggiuntive a causa della precedenza degli operatori. Quando si hanno '+' e '*' come in queste due equazioni e senza parentesi si va sempre per '' 'prima e poi per' + '. – rbaleksandar

43

Ecco la mia implementazione 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

Calcola preventivamente il fattore di conversione in modo che ci siano meno possibilità di digitare la conversione errata utilizzando i numeri codificati. –

16

Chi ha bisogno di trig quando si hanno 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

Come funziona? Come si confronta la velocità? Perché questo non è più comunemente usato? –

+0

@ MarkA.Ropper come funzionano i numeri complessi? - consulta un tutorial di matematica o vai da https://en.wikipedia.org/wiki/Euler%27s_identity se sai già cos'è un numero complesso. Probabilmente non è così efficiente nella velocità rispetto a dire implementare il peccato come una tabella di ricerca, ma a volte si utilizzano numeri complessi per rappresentare punti in tutto per sfruttare altre proprietà di essi. Simile all'utilizzo di quaternioni per le rotazioni 3D, non è davvero la velocità ma le capacità che ti danno. –

Problemi correlati