42 Stimmen

Berechnen von Punkt auf einem Kreisumfang von Winkel in C#?

Ich kann mir vorstellen, dass dies eine einfache Frage ist, aber ich erhalte einige seltsame Ergebnisse mit meinem aktuellen Code und ich habe nicht den mathematischen Hintergrund, um vollständig zu verstehen, warum. Mein Ziel ist einfach, wie im Titel angegeben: Ich möchte nur den Punkt in einem bestimmten Abstand und Winkel von einem Mittelpunkt finden.

Mein aktueller Code:

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

Im Allgemeinen scheint dies ziemlich vernünftig zu funktionieren, aber ich bekomme Probleme an verschiedenen Stellen, vor allem, wenn der Winkel Punkte in der negativen x und y-Achse entspricht. Offensichtlich tue ich etwas falsch - Gedanken darüber, was das ist?

UPDATE: Das war mein Fehler, dieser Code funktioniert einwandfrei - die wenigen Ausreißer, die nicht funktionierten, waren tatsächlich auf einen Fehler in der Art und Weise zurückzuführen, wie der Winkel für 1,5PI berechnet wurde. Ich dachte, ich hätte das gut genug überprüft, aber offensichtlich war das nicht der Fall. Vielen Dank an alle, die sich die Zeit genommen haben, und ich hoffe, dass der obige funktionierende Code für andere hilfreich ist.

35voto

MartinStettner Punkte 27921

Sie haben vergessen, den Mittelpunkt hinzuzufügen:

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

Der Rest sollte in Ordnung sein... (welche seltsamen Ergebnisse haben Sie erhalten? Können Sie eine genaue Eingabe machen?)

6voto

John Rasch Punkte 60054

Erstens: Da Sie im Bogenmaß arbeiten, ist es wahrscheinlich von Vorteil, den Winkel auch so zu definieren:

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

Die Funktionen selbst funktionieren einwandfrei. Die Rundung wirkt sich nur dann auf Ihre Antwort aus, wenn Ihr Abstand ausreichend klein ist. Andernfalls sollten die Antworten gut ausfallen.

Wenn Sie sich Sorgen um die Rundung machen, denken Sie daran, dass .NET standardmäßig die kaufmännische Rundung und Sie möchten vielleicht:

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

stattdessen.

In der Frage, die Sie stellen wollen, heißt es außerdem Abstand X und Winkel Y ... Ich nehme an, Sie beziehen das nicht auf den Punkt (X,Y) denn das ist etwas ganz anderes.

Die Entfernungsformel lautet:

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

3voto

Joe Susnick Punkte 5983

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

1voto

JonBWalsh Punkte 311

Ohne weitere Informationen über die genauen Fehler ist es schwer zu sagen, was falsch ist. Die Gleichungen sehen richtig aus und sollten funktionieren. Sind Sie sicher, dass die Winkel, die Sie eingeben, für Winkel > 90 Grad korrekt sind? Die einzige andere Sache, die mir einfällt, wäre, dass Sie die Entfernung (ein int) mit dem Ergebnis von Math.sin (double) multiplizieren, aber das sollte eigentlich kein Problem sein.

1voto

Tahir Waseem Punkte 141
-(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;   
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X