2009-03-23 12 views
35

J'imagine que c'est une question simple, mais je reçois des résultats étranges avec mon code actuel et je n'ai pas les connaissances 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 d'un point central.Calcul du point sur la circonférence d'un cercle à partir de l'angle en C#?

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 raisonnable, mais je reçois des problèmes à différents endroits, notamment lorsque l'angle correspond à des points dans les x négatifs et l'axe y. Clairement je fais quelque chose de mal - des pensées sur ce que c'est? MISE À JOUR: Ce fut mon erreur, ce code fonctionne bien - les quelques valeurs aberrantes qui ne fonctionnaient pas étaient en fait dues à un bug dans la façon dont l'angle de 1,5PI était calculé. Je pensais que j'avais bien vérifié, mais évidemment pas. Merci à tous pour leur temps, j'espère que le code de travail ci-dessus sera utile à quelqu'un d'autre.

+0

Qu'est-ce que tu veux dire "je reçois des problèmes à différents endroits"? –

+0

centerPoint est délibérément utilisé? Est-ce que centerPoint.X et .Y ne doivent pas être ajoutés au résultat? – spender

+0

pouvez-vous fournir un exemple d'un problème? –

Répondre

29

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 ok ... (quels résultats étranges vous obtiennent Pouvez-vous donner une entrée exacte?)

+0

Ah, c'est un bon point sur le point central - il est inutilisé dans ce cas. Le point précis sur lequel je travaille actuellement est avec un point central de 0,0, donc ce n'est pas pertinent dans ce cas, mais dans d'autres cas, cela ferait certainement une différence. J'ai mis à jour l'exemple pour l'inclure correctement. – x4000

6

Tout d'abord, puisque vous êtes en radians il est probablement utile de définir votre angle en tant que tel:

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

Les fonctions elles-mêmes fonctionnent très bien. L'arrondi affectera seulement votre réponse si votre distance est suffisamment petite. A part ça, les réponses devraient être très bien.

Si c'est que vous êtes inquiet au sujet d'arrondi, rappelez-vous que par défaut, .NET ne banker's rounding, et vous voudrez peut-être:

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.

De plus, dans la question que vous voulez distance X et Y angle ... Je suppose que vous n'êtes pas que relatif au point (X,Y), parce que c'est complètement différent.

La formule de distance est:

double distance = Math.Sqrt((centerPoint.X + result.X)^2 + (centerPoint.Y + result.Y)^2); 
+0

John, Merci pour le poisson. J'étais parfaitement inconscient que C# arrondissait des doubles calculs du tout, et encore moins terriblement (IMHO). – corlettk

1

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 des angles> 90 degrés? La seule autre chose que je pourrais penser serait que vous multipliez la distance (un int) par le résultat de Math.sin (double) mais cela ne devrait pas vraiment être un problème.

+0

Vous avez parfaitement raison, l'entrée d'angle était désactivée. – x4000

0

Je ne sais pas C#, de toute façon si vous essayez d'en tirer les points de quelque part, vous devez tenir compte du fait que le pli de l'axe Y du haut vers le bas de l'écran, de sorte que votre élément péché devrait avoir être -sin (...) et non + sin (...)

si

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'êtes pas essayer de les dessiner, je ne pouvais pas imaginer ce que le problème est, pouvez-vous donner un exemple?

+0

résultat.Y devrait utiliser cos not sin vérifier ce lien http://www.webdeveloper.com/forum/showthread.php?t=190439 – RVN

1
-(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;   
    } 
+0

Retour 6 Points pour un cercle de rayon 100. L'équation paramétrique pour un cercle est x = cx + r * cos (a) y = cy + r * sin (a) Où r est le rayon, cx, cy l'origine et a l'angle de 0..2PI radians ou 0..360 degrés . – Waseem

2

A 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) 
}