3 Stimmen

Bewegen Sie sich von Winkel A nach B, finden Sie die kürzeste Richtung.

Ich habe einen Winkel A und einen Zielswinkel B

Der Bereich für die Winkel liegt bei -180 bis 180

Ich möchte, dass Winkel A sich um X Grad in Richtung Winkel B bewegt

Das Problem, dem ich gegenüberstehe, ist, wenn A zum Beispiel 170 und B -170 ist, ist es offensichtlich schneller, sich auf 180 zu erhöhen und dann zu -180 zu springen, aber wenn ich die Winkel vergleiche, erhalte ich immer X als negativ. Anstatt den schnellsten Weg zu nehmen, wird also der längste Weg genommen.

Ich hoffe, jemand wird meine schlecht formulierte Frage verstehen :)

A = A + ((A-B) / Math.Abs(A-B)) * speed * -1;

Bearbeitet: Code hinzugefügt

6voto

duedl0r Punkte 9112

Berechnen Sie den Unterschied zwischen den beiden Winkeln. Wenn der resultierende Winkel x größer als 180 Grad ist, gehen Sie in die andere Richtung mit diesem Winkel: 360-x.

Wenn Sie den Bereich von 0 bis 360 verwenden, können Sie den Unterschied einfacher berechnen.

1voto

George Duckett Punkte 31040

Hier ist ein komplettes Beispiel:

void Main()
{
    int speed = 5;

    int angleA = 170;
    int angleB = -170;

    int antiClockwiseDistance = Math.Abs(180 - angleA) + Math.Abs(-180 - angleB);
    int clockwiseDistance = angleB - angleA;

    Console.WriteLine(clockwiseDistance);
    Console.WriteLine(antiClockwiseDistance);

    if(clockwiseDistance < antiClockwiseDistance)
    {
        angleA += speed;
    }
    else
    {
        angleA -= speed;
    }

    // TODO: Code zum Umschließen eines Winkels außerhalb des Bereichs (d.h. 190 => -170)

    Console.WriteLine(angleA);
}

0voto

Daniel Daranas Punkte 22022

Stelle dir vor, du bist ein Mensch und dir wird dieses Problem zur Lösung gegeben. Wie würdest du es lösen?

Schreibe fünf oder sechs Beispiele, einschließlich "besonderer" Winkel wie 0, 180, -180 und Werte nahe diesen.

Skizziere jedes Beispiel.

Es wird nicht schwer sein, einen einfachen und verständlichen Algorithmus zu finden, der eine oder zwei Bedingungen verwendet und zu einem Ergebnis führt.

Insbesondere musst du nur den kürzesten von zwei Wegen finden, daher ist es eine gute Abstraktion herauszufinden, welche Länge jeder Weg hat, und sie dann einfach zu vergleichen und den mit der kleineren Länge auszuwählen.

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