40 votes

Calculer le point sur la circonférence d'un cercle à partir d'un angle en C #?

J'imagine que c'est une question simple, mais je suis l'obtention de certains résultats étranges avec mon code actuel, et je n'ai pas de formation 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 l'angle à partir 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 l'angle correspond à des points dans le négatif de l'axe x et y. Clairement, je suis en train de faire quelque chose de mal -- réflexions sur ce que c'est?

Mise à JOUR: Ce qui a été mon erreur, ce code fonctionne très bien-les quelques valeurs aberrantes qui ne travaillaient pas étaient en fait dû à un bogue dans quelle mesure l'angle de 1,5 PI a été calculé. Je pensais que j'avais vérifié que assez bien, mais de toute évidence n'avait pas. Merci à tous pour leur temps, espérons-le code de travail ci-dessus vous seront utiles à quelqu'un d'autre.

34voto

MartinStettner Points 14514

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 être bon ... (quels résultats étranges obteniez-vous? Pouvez-vous donner une information exacte?)

6voto

John Rasch Points 28874

Tout d'abord, puisque vous êtes en radians c'est probablement bénéfique pour définir votre point de vue en tant que tel:

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

Les fonctions elles-mêmes fonctionnent très bien. L'arrondi n'affecteront votre réponse si la distance est suffisamment assez petit. Autres que que, les réponses devraient sortir très bien.

Si c'est l'arrondi vous êtes inquiet au sujet, rappelez-vous que par défaut .NET ne l'arrondi, et vous pouvez:

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);

au lieu de cela.

En outre, dans la question que vous voulez de l'axe des X et l'angle Y... je suppose que vous n'êtes pas de relation, au point de (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);

1voto

JonBWalsh Points 206

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

1voto

Tahir Points 51
-(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;   
    }

0voto

Andrea Ambu Points 6479

Je ne sais pas c #, de toute façon si vous essayez de tracer les points quelque part, vous devez tenir compte du fait que l'axe des Y se plie du haut vers le bas de l'écran, de sorte que votre élément péché aurait dû être -sin (.. .) et pas + péché (...)

alors

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

devraient devenir:

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

Si vous n'essayez pas de les dessiner, je ne peux pas imaginer le problème, pouvez-vous donner un exemple?

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