2009-05-08 12 views
185

Comment la fonction suivante peut-elle être implémentée dans différentes langues?Comment calculer un point sur la circonférence d'un cercle?

calculer le point (x,y) sur la circonférence d'un cercle, les valeurs d'entrée fournies à:

  • Rayon
  • Angle
  • origine (paramètre facultatif, si pris en charge par la langue)
+2

Peu probable, @Binary, depuis qu'il a posté une réponse. C'est l'une des questions à réponse personnelle (qui sont autorisées, selon les communications précédentes des modérateurs). Mais étant donné qu'il a déjà été répondu à http://stackoverflow.com/questions/674225/calculating-point-on-a-circles-circumference-from-angle-in-c, il est probablement mieux fermé en dupe. Les langues qui le font ne seront pas si disparates. – paxdiablo

+21

Je viens de me connecter pour dire ceci: vous monsieur (Rook) êtes un Jerk. Tout le monde n'a pas le même niveau d'éducation que vous, mais peut toujours coder, donc ce n'est pas une question de golf trivial code. Honte à toi. – Braineeee

Répondre

468

Le parametric equation for a circle est

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

Lorsque r est le rayon, cx, cy l'origine, et un l'angle.

C'est assez facile à adapter dans n'importe quelle langue avec les fonctions trigonométriques de base. Notez que la plupart des langages utiliseront radians pour l'angle dans les fonctions trigonométriques, alors plutôt que de parcourir 0..360 degrés, vous parcourez 0..2PI radians.

+74

Notez que 'a' doit être en radians - c'était vraiment difficile pour moi, en tant que débutant, de comprendre. – ioanb7

+8

J'ai essayé de calculer cette équation pendant une heure maintenant. Merci. Qui connaît les identités trigonométriques que vous avez apprises à l'école secondaire serait si utile. –

+1

@Dean Pas besoin de crochets supplémentaires en raison de la priorité de l'opérateur. Quand vous avez '+' et '*' comme dans ces deux équations et sans les parenthèses, vous allez toujours d'abord '*' et ensuite '+'. – rbaleksandar

43

Voici ma mise en œuvre en 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

Précalculez le facteur de conversion afin qu'il y ait moins de chance de taper la conversion en utilisant des nombres codés en dur. –

16

Qui a besoin trig quand vous avez 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

Comment cela fonctionne-t-il? Comment compare-t-il la vitesse? Pourquoi n'est-ce pas plus communément utilisé? –

+0

@ MarkA.Ropper comment fonctionnent les nombres complexes? - Cherchez un tutoriel de mathématiques ou allez à https://en.wikipedia.org/wiki/Euler%27s_identity si vous savez déjà ce qu'est un nombre complexe. Il n'est probablement pas aussi efficace en termes de rapidité que l'implémentation du péché en tant que table de consultation, mais parfois vous utilisez des nombres complexes pour représenter les points afin d'en exploiter d'autres propriétés. Similaire à l'utilisation de quaternions pour les rotations 3D, ce n'est pas vraiment la vitesse mais les capacités qu'ils vous donnent. –

Questions connexes