Calcul du point sur la circonférence d'un cercle à partir de l'angle en C?

j'imagine que c'est une question simple, mais j'obtiens des résultats étranges avec mon code actuel et je n'ai pas l'expérience en mathématiques pour bien comprendre pourquoi. Mon objectif est simple, comme indiqué dans le titre: je veux juste trouver le point à une certaine distance et angle d'un point central.

mon code actuel:

Point centerPoint = new Point ( 0, 0 );
Point result      = new Point ( 0, 0 );
double angle      = 0.5; //between 0 and 2 * PI, angle is in radians
int distance      = 1000;

result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );
result.X = centerPoint.X + (int)Math.Round( distance * Math.Cos( angle ) );

En général, cela semble fonctionner assez, mais j'ai des problèmes à différents endroits, notamment lorsque la l'angle correspond aux points des axes X et y négatifs. Clairement je fais quelque chose de mal ... des pensées sur ce que c'est?

mise à jour: c'était mon erreur, ce code fonctionne très bien -- les quelques valeurs aberrantes qui ne fonctionnaient pas étaient en fait dues à un bug dans la façon dont l'angle pour 1,5 PI était calculé. Je pensais avoir vérifié cela assez bien, mais évidemment pas. Merci à tous pour leur temps, espérons que le code de travail ci-dessus sera utile à quelqu'un d'autre.

37
demandé sur Jonas 2009-03-23 19:57:06

6 réponses

vous avez oublié d'ajouter le point central:

result.Y = (int)Math.Round( centerPoint.Y + distance * Math.Sin( angle ) );
result.X = (int)Math.Round( centerPoint.X + distance * Math.Cos( angle ) );

le reste devrait aller... (quels résultats étranges obteniez-vous? Pouvez-vous donner une exacte d'entrée?)

31
répondu MartinStettner 2009-03-23 17:19:08

tout D'abord, puisque vous êtes en radians, il est probablement bénéfique de définir votre angle comme tel:

double angle = (Math.PI / 3); // 60 degrees...

les fonctions elles-mêmes fonctionnent bien. L'arrondissement n'affectera votre réponse que si votre distance est suffisamment petite. À part ça, les réponses devraient être parfaites.

si c'est l'arrondissement qui vous inquiète, rappelez-vous que par défaut, .NET fait l'Arrondissement de la banque , et vous pouvez want:

result.X = (int)Math.Round(centerPoint.X + distance * Math.Cos(angle), MidpointRounding.AwayFromZero);
result.Y = (int)Math.Round(centerPoint.Y + distance * Math.Sin(angle), MidpointRounding.AwayFromZero);

à la place.

en outre, dans la question vous voulez distance X et angle Y ... Je suppose que vous ne reliez pas cela au point (X,Y) , parce que c'est complètement différent.

la formule de la distance est:

double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2);
6
répondu John Rasch 2009-03-23 18:11:49

Un Swift3 version

func pointOnCircle(radius: Double, angleInDegrees: Double, origin: CGPoint) -> CGPoint {
    let x = abs(Double(origin.x) + radius * cos(angleInDegrees * (.pi / 180)))
    let y = abs(Double(origin.y) - radius * sin(angleInDegrees * (.pi / 180)))

    return CGPoint(x: x, y: y)
}
2
répondu Joe Susnick 2017-08-08 19:43:25

sans plus d'informations sur les erreurs exactes, il est difficile de dire ce qui ne va pas. Les équations semblent correctes et devraient fonctionner. Êtes-vous sûr que les angles que vous passez sont corrects pour les angles > 90 degrés? La seule autre chose à laquelle je pourrais penser serait que vous multipliez la distance (un int) par le résultat des maths.sin (double) mais cela ne devrait pas vraiment être un problème.

1
répondu JonBWalsh 2009-03-23 18:12:00
-(NSMutableArray *)GetPointsForCircle
    {
       NSMutableArray *Points = [[NSMutableArray alloc] init];
       CGPoint CenterPoint = CGPointMake(160, 230);
       CGPoint Point;
       for (float Angel = 0; Angel <= 360; Angel+= 60)
         {
           Point.x = CenterPoint.x + 100 * cos(Angel);
           Point.y = CenterPoint.y + 100 * sin(Angel);
           [Points addObject:[NSValue valueWithCGPoint:Point]];
         }
       return Points;
    }

    - (CGPoint)pointOnCircle:(int)thisPoint withTotalPointCount:(int)totalPoints
     {
        CGPoint centerPoint = CGPointMake(self.view.frame.size.width / 2, self.view.frame.size.height / 2);
        float radius = 100.0;
        float angle = ( 2 * M_PI / (float)totalPoints ) * (float)thisPoint;
        CGPoint newPoint;
        newPoint.x = (centerPoint.x) + (radius * cosf(angle));
        newPoint.y = (centerPoint.y) + (radius * sinf(angle));
        return newPoint;   
    }
1
répondu Waseem 2012-09-20 06:04:22

Je ne sais pas c#, de toute façon si vous essayez de dessiner les points quelque part vous devez considérer le fait que l'axe des Y plisse du haut au bas de l'écran, de sorte que votre sin élément aurait dû être - sin(...) et non +sin (...)

donc

result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );

devrait devenir:

result.Y = centerPoint.Y - (int)Math.Round( distance * Math.Sin( angle ) );

si vous n'essayez pas de les dessiner Je ne pourrais pas imaginez le problème, Pouvez-vous donner un exemple?

0
répondu Andrea Ambu 2009-03-23 18:18:37