Question

Je suppose que cela est une question simple, mais je reçois des résultats étranges avec mon code actuel et je n'ai pas l'arrière-plan de mathématiques pour comprendre pourquoi. Mon objectif est simple, comme il est dit dans le titre. Je veux juste trouver le point à une certaine distance et de l'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 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. Il est clair que je fais quelque chose de mal - réflexions sur ce qui est

Mise à jour: Ce fut mon erreur, ce code fonctionne très bien - les quelques valeurs aberrantes qui ne travaillaient pas étaient en fait en raison d'un bogue dans la façon dont était calculé l'angle pour 1.5PI. Je pensais que je l'avais vérifié assez bien, mais il avait évidemment pas. Merci à tous pour leur temps, nous espérons que le code de travail se révélera utile ci-dessus à quelqu'un d'autre.

Était-ce utile?

La solution

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 que vous obtenez? Pouvez-vous donner une entrée exacte?)

Autres conseils

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 uniquement votre réponse si la distance est suffisamment assez petit. A part cela, les réponses devraient sortir très bien.

Si elle est l'arrondissement que vous êtes inquiet, rappelez-vous que, par défaut, .NET ne l'arrondissement de banquier , 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);

au lieu.

En outre, 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 tout à fait différent.

La formule de la distance est la suivante:

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

Une version swift3

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

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

-(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;   
    }

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 sin élément doit avoir être -sin (...) et non + sin (...)

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top