94 votes

Trouvez le point d'un cercle dont le centre, le rayon et le degré sont donnés.

Cela fait 10 ans que je n'ai pas fait de calcul de ce genre... Je suis en train de programmer un jeu en 2D et de déplacer un joueur. Lorsque je déplace le joueur, j'essaie de calculer le point d'un cercle situé à 200 pixels de la position du joueur, en fonction d'un angle (degré) positif OU négatif compris entre -360 et 360. L'écran est de 1280x720 avec 0,0 étant le point central de l'écran. Le joueur se déplace dans tout ce système de coordonnées cartésiennes. Le point que j'essaie de trouver peut être hors de l'écran.

J'ai essayé les formules de l'article Trouvez le point avec le rayon et l'angle mais je ne crois pas que je comprenne ce qu'est "Angle" car j'obtiens des résultats bizarres lorsque je passe Angle comme -360 à 360 dans un Cos(angle) ou Sin(angle).

Donc, par exemple, j'ai...

  • 1280x720 sur un plan cartésien
  • Point central (la position du joueur) :
    • let x = un nombre entre le minimum -640 et le maximum 640
    • let y = un nombre entre le minimum -360 et le maximum 360
  • Rayon du cercle autour du joueur : let r always = 200
  • Angle : a = un nombre donné entre -360 et 360 (on peut indiquer un nombre négatif pour pointer vers le bas ou positif pour pointer vers le haut, donc -10 et 350 donnent la même réponse).

Quelle est la formule pour retourner X sur le cercle ?

Quelle est la formule pour ramener Y sur le cercle ?

enter image description hereenter image description here

23 votes

C'est une BONNE question ! !! +1

1 votes

Question : La plupart des jeux n'ont-ils pas leurs coordonnées en haut à gauche à 0,0 ? et l'axe des y va vers le bas, pas vers le haut ?

82voto

Jim Points 4285

Les équations simples de votre lien donnent les coordonnées X et Y du point sur le cercle par rapport au centre du cercle .

X = r * cosine(angle)  
Y = r * sine(angle)

Cela vous indique à quelle distance le point est décalé par rapport au centre du cercle. Puisque vous avez les coordonnées du centre (Cx, Cy), il suffit d'ajouter le décalage calculé.

Les coordonnées du point sur le cercle sont :

X = Cx + (r * cosine(angle))  
Y = Cy + (r * sine(angle))

1 votes

Ma confusion portait d'abord sur la différence entre ANGLE et DEGRÉ. Je pensais que c'était la même chose. Ensuite, j'ai pensé que j'obtenais le point (x,y) sur le plan, mais en fait, j'obtenais la longueur des côtés de x et y. J'ai fait un dessin sur papier, puis je l'ai placé dans Excel pour couvrir la gamme de degrés et vérifier les formules. Cela fonctionne maintenant dans mon code.

3 votes

Il ne faut pas X = xcircle + (r * sine(angle)) être X = xcircle + (r * cosine(angle)) (et vice versa pour le Y ) ?

5 votes

Remarquez que l'angle doit être une valeur en radians !

18voto

Seth Battin Points 1115

Vous devriez afficher le code que vous utilisez. Cela aiderait à identifier exactement le problème.

Cependant, puisque vous avez mentionné la mesure de votre angle en termes de -360 à 360, vous utilisez probablement les mauvaises unités pour votre bibliothèque mathématique. La plupart des implémentations des fonctions de trigonométrie utilisent des radians pour leur entrée. Et si vous utilisez des degrés à la place... vos réponses seront étrangement fausses.

x_oncircle = x_origin + 200 * cos (degrees * pi / 180)
y_oncircle = y_origin + 200 * sin (degrees * pi / 180)

Notez que vous pouvez également rencontrer des circonstances où le quadrant n'est pas celui auquel vous vous attendez. Cela peut être corrigé en sélectionnant soigneusement l'emplacement de l'angle zéro, ou en vérifiant manuellement le quadrant attendu et en appliquant vos propres signes aux valeurs du résultat.

1 votes

Ceci devrait vraiment être un commentaire plutôt qu'une réponse. Cependant, bien vu pour les radians et les degrés.

0 votes

Question sur le poste de zombie : entre parenthèses, est-ce que c'est (deg * (pi / 180)) ou dans l'autre sens ((deg * pi) / 180) ? Merci également de préciser la différence entre rad et deg.

0 votes

Les zombies de @monsto envoient toujours des notifications. :). Les parenthèses intérieures n'ont pas d'importance car la multiplication et la division sont commutatives. démonstrations.wolfram.com/ . Je suis depuis longtemps coupable de mettre trop de parens dans mon code. Je prétends que c'est pour la clarté, mais il est clair que ce n'est pas strictement vrai, sinon cela ne vous aurait pas dérangé.

6voto

Wraithious Points 105

J'en avais également besoin pour former en code le mouvement des aiguilles d'une horloge. J'ai essayé plusieurs formules mais elles ne fonctionnaient pas, alors voici ce que j'ai trouvé :

  • mouvement - sens des aiguilles d'une montre
  • points - tous les 6 degrés (parce que 360 degrés divisés par 60 minuites font 6 degrés)
  • longueur de la main - 65 pixels
  • centre - x=75,y=75

La formule serait donc

x=Cx+(r*cos(d/(180/PI))
y=Cy+(r*sin(d/(180/PI))

où x et y sont les points sur la circonférence d'un cercle, Cx et Cy sont les coordonnées x,y du centre, r est le rayon, et d est la quantité de degrés.

6voto

Johan Larsson Points 4405

Je suggère fortement d'utiliser des matrices pour ce type de manipulations. C'est l'approche la plus générique, voir l'exemple ci-dessous :

// The center point of rotation
var centerPoint = new Point(0, 0);
// Factory method creating the matrix                                        
var matrix = new RotateTransform(angleInDegrees, centerPoint.X, centerPoint.Y).Value;
// The point to rotate
var point = new Point(100, 0);
// Applying the transform that results in a rotated point                                      
Point rotated = Point.Multiply(point, matrix); 
  • Remarque : la convention veut que l'on mesure l'angle dans le sens inverse des aiguilles d'une montre en partant de l'axe X (positif).

5voto

dasblinkenlight Points 264350

J'obtiens des résultats étranges lorsque je passe un angle de -360 à 360 dans un Cos(angle) ou Sin(angle).

Je pense que la raison pour laquelle votre tentative n'a pas fonctionné est que vous passiez les angles en degrés. Le site sin y cos Les fonctions trigonométriques requièrent des angles exprimés en radians, les nombres doivent donc être compris entre 0 et 10. 0 a 2*M_PI . Pour d les diplômes que vous passez M_PI*d/180.0 . M_PI est une constante définie dans math.h en-tête.

0 votes

Je me suis dit que l'angle et le degré n'étaient probablement pas la même chose. Ai-je raison de dire Angle = M_PI*d/180.0 où d peut être un nombre compris entre -360 et 360 ou dois-je faire une autre étape ?

1 votes

@Kyle d vient de 0 a 360 ou de -180 a 180 (un cercle complet), et non de -360 a 360 (deux cercles complets).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X