Trouver le point sur un cercle avec un centre, un rayon et un degré donnés

ça fait 10 ans que je n'ai pas fait ce genre de calcul... Je programme un jeu en 2D et déplace un joueur. Alors que je déplace le joueur, j'essaie de calculer le point sur un cercle de 200 pixels loin de la position du Joueur avec un angle(degré) positif ou négatif entre -360 et 360. L'écran est 1280x720 avec 0,0 étant le point central de l'écran. Le joueur se déplace autour de ce système de coordonnées cartésiennes. 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 que" L'Angle " est parce que je reçois des résultats bizarres quand je passe L'Angle comme -360 à 360 dans un Cos(angle) ou Sin(angle).

ainsi, par exemple, j'ai...

  • 1280x720 sur un plan cartésien
  • point central (la position du Joueur):
    • let x = un nombre entre le minimum -640 à un maximum de 640
    • let y = un nombre minimum entre -360 à un maximum de 360
  • rayon de cercle autour du Joueur: R always = 200
  • Angle: soit a = un nombre donné d'entre -360 à 360 (permettre négatif pour pointer vers le bas ou positive pour pointer vers le haut de sorte -10 et 350 donnerait la même réponse)

Quelle est la formule pour retourner X sur le cercle?

Quelle est la formule pour retourner Y sur le cercle?

enter image description here enter image description here

66
demandé sur Community 2012-12-31 04:23:13

8 réponses

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)

indique la distance entre le point et le centre du cercle. Puisque vous avez les coordonnées du centre (Cx, Cy), il suffit d'ajouter l'offset calculé.

Les coordonnées du point sur le cercle sont:

X = Cx + (r * cosine(angle))  
Y = Cy + (r * sine(angle))
49
répondu yoozer8 2017-01-08 06:49:50

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

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 de trigonométrie utilisent des radians pour leur entrée. Et si vous utilisez degrés au lieu...vos réponses seront bizarrement mal.

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

notez que vous pourriez aussi tomber sur cas où le quadrant n'est pas ce que vous attendez. Cela peut être corrigé en sélectionnant soigneusement l'angle zéro, ou en vérifiant manuellement le quadrant que vous attendez et en appliquant vos propres signes aux valeurs de résultat.

9
répondu Seth Battin 2012-12-31 00:35:18

je suggère fortement d'utiliser des matrices pour ce type de manipulations. Il s'agit de 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); 
  • note latérale, la convention est de mesurer l'angle dans le sens contraire des aiguilles d'une montre à partir de la forme (positif) X-axis
6
répondu Johan Larsson 2013-01-02 18:34:12

j'obtiens des résultats bizarres quand je passe Angle as -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 des angles en degrés. Les fonctions trigonométriques sin et cos prévoient des angles exprimés en radians, de sorte que les nombres doivent être de 0 à 2*M_PI . Pour d degrés vous passez M_PI*d/180.0 . M_PI est une constante définie dans l'en-tête math.h .

4
répondu dasblinkenlight 2012-12-31 00:28:41

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

  • mouvement 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
  • center-x = 75,y =75

Ainsi, 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 le montant de degrés.

3
répondu Wraithious 2017-01-08 06:44:43

voici le C # implementation. La méthode retournera les points circulaires qui prend radius , center et angle interval comme paramètre. 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 appelant:

List<PointF> LEPoints = getCircularPoints(10.0f, new PointF(100.0f, 100.0f), Math.PI / 6.0f);
1
répondu MD. Nazmul Kibria 2018-04-19 05:17:04

la réponse doit être exactement opposée.

X = Xc + rSin (angle)

Y = Yc + rCos (angle)

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

0
répondu Aditya Aggarwal 2017-01-08 03:57:14

recommande:

 public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3 
pivot, Vector3 angles)
    {
	    return Quaternion.Euler(angles) * (point - pivot) + pivot;
    }
0
répondu kid 2017-08-15 06:25:13