c# - zellus - propriété point appartient cercle




Trouver le point sur un cercle avec un point central, un rayon et un degré donnés (6)

J'obtiens des résultats bizarres lorsque je passe Angle en tant que -360 à 360 dans un Cos (angle) ou un Sin (angle).

Je pense que la raison pour laquelle votre tentative n'a pas fonctionné est que vous passiez des angles en degrés. Les fonctions trigonométriques sin et cos attendent des angles exprimés en radians, les nombres doivent donc être 2*M_PI entre 0 et 2*M_PI . Pour d degrés, vous réussissez M_PI*d/180.0 . M_PI est une constante définie dans l'en-tête math.h

Cela fait 10 ans que j'ai fait des calculs comme ça ... Je programme un jeu en 2D et déplace un joueur. Pendant que je déplace le joueur, j'essaie de calculer le point sur un cercle à 200 pixels de la position du joueur, avec un angle positif (degré) compris entre -360 et 360. L'écran est 1280x720 avec 0,0 étant le centre de l'écran. Le joueur se déplace autour de ce système de coordonnées cartésien. Le point que j'essaie de trouver peut être hors écran.

J'ai essayé les formules sur l'article Trouver le point avec le rayon et l'angle mais je ne crois pas que je comprends ce qu'est "Angle" parce que j'obtiens des résultats bizarres quand 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):
    • soit x = un nombre compris entre minimum -640 et maximum 640
    • Soit y = un nombre compris entre minimum -360 et maximum 360
  • Rayon de cercle autour du joueur: laissez r = 200
  • Angle: Soit a = un nombre compris entre -360 et 360 (permet au négatif de pointer vers le bas ou positif pour pointer vers le haut, donc -10 et 350 donneraient la même réponse)

Quelle est la formule pour renvoyer X sur le cercle?

Quelle est la formule pour renvoyer Y sur le cercle?


J'avais aussi besoin de ceci pour former le mouvement des aiguilles d'une horloge en code. J'ai essayé plusieurs formules mais elles n'ont pas fonctionné, alors c'est ce que j'ai imaginé:

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

Donc, la formule serait

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.


La réponse devrait être exactement opposée.

X = Xc + rSin (angle)

Y = Yc + rCos (angle)

où Xc et Yc sont les coordonnées du centre du cercle et r le rayon.


Les équations simples que vous avez liées pour donner 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), ajoutez simplement le décalage calculé.

Les coordonnées du point sur le cercle sont:

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

Voici l'implémentation c #. La méthode renvoie les points circulaires qui prennent comme paramètre l' angle interval entre le radius , le center et l' angle interval . Angle est passé comme Radian.

public static List<PointF> getCircularPoints(double radius, PointF center, double angleInterval)
        {
            List<PointF> points = new List<PointF>();

            for (double interval = angleInterval; interval < 2 * Math.PI; interval += angleInterval)
            {
                double X = center.X + (radius * Math.Cos(interval));
                double Y = center.Y + (radius * Math.Sin(interval));

                points.Add(new PointF((float)X, (float)Y));
            }

            return points;
        }

et l'exemple d'appel:

List<PointF> LEPoints = getCircularPoints(10.0f, new PointF(100.0f, 100.0f), Math.PI / 6.0f);

Vous devez poster le code que vous utilisez. Cela aiderait à identifier le problème avec précision.

Cependant, puisque vous avez mentionné mesurer votre angle en termes de -360 à 360, vous utilisez probablement les unités incorrectes pour votre bibliothèque de mathématiques. La plupart des implémentations de fonctions trigonométriques utilisent des radians pour leurs entrées. Et si vous utilisez plutôt des diplômes, 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 pourriez également rencontrer des circonstances où le quadrant n'est pas ce que vous attendez. Cela peut être résolu en sélectionnant avec soin l’angle zéro ou en vérifiant manuellement le quadrant attendu et en appliquant vos propres signes aux valeurs de résultat.