Konvertieren Sie einen Winkel in Grad, um einen Vektor
Mache ich ein Spiel Programmieren. FWIW bin ich mit XNA, aber ich bin zweifelhaft, ob dies relevant ist.
Ich würde gerne konvertieren Grad zu einem Richtungs-Vektor (dh X und Y) mit dem Ausmaß 1.
Mein Ursprung (0,0) in der oberen linken.
Also möchte ich die 0-Grad-konvertieren auf [0, -1]
Ich dachte, der beste Weg, dies zu tun war meine definition von Norden/Oben und drehen Sie es mit einer matrix, aber dies scheint nicht zu funktionieren.
Hier ist der Code...
public class Conversion
{
public static Vector2 GetDirectionVectorFromDegrees(float Degrees)
{
Vector2 North= new Vector2(0, -1);
float Radians = MathHelper.ToRadians(Degrees);
var RotationMatrix = Matrix.CreateRotationZ(Radians);
return Vector2.Transform(North, RotationMatrix);
}
}
... und hier sind meine unit-tests...
[TestFixture]
public class Turning_Tests
{
[Test]
public void Degrees0_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(0);
Assert.AreEqual(0, result.X);
Assert.AreEqual(-1, result.Y);
}
[Test]
public void Degrees90_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(90);
Assert.AreEqual(1, result.X);
Assert.AreEqual(0, result.Y);
}
[Test]
public void Degrees180_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(180);
Assert.AreEqual(0, result.X);
Assert.AreEqual(1, result.Y);
}
[Test]
public void Degrees270_Tests()
{
Vector2 result = Conversion.GetDirectionVectorFromDegrees(270);
Assert.AreEqual(-1, result.X);
Assert.AreEqual(0, result.Y);
}
}
Bin ich nähert sich diese alle falsch?
Soll ich mich mit einer matrix?
Habe ich Mist gebaut und konvertiert von Grad in Bogenmaß an der falschen Stelle?
Ich habe schon Vorschläge gesehen, diese kann getan werden, mithilfe von code wie:
new Vector2((float)Math.Cos(Angle), (float)Math.Sin(Angle));
...oder manchmal...
new Vector2((float)Math.Sin(Angle), (float)Math.Cos(Angle));
Aber diese scheinen nicht zu funktionieren, entweder
Kann jemand mich auf den richtigen Weg... oder noch besser: geben Sie mir einige code, der bewirkt, dass die 4 bereitgestellten unit-tests auf Pfad?
Vielen Dank im Voraus.
InformationsquelleAutor Rory Becker | 2013-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einfach:
Werden Sie sicher, konvertieren von Grad in Bogenmaß mit diesem Ansatz auch.
Diese verwendet der Mathematiker die Konvention ab
[1, 0]
und geht in die Richtung[0, 1]
(das ist gegen den Uhrzeigersinn mit der Orientierung, dass die Mathematiker benutzen für die beiden Achsen).Verwenden Sie stattdessen Ihre übereinkommen (ab
[0, -1]
und gehen in die Richtung der[1, 0]
) Sie benötigen:Beachten Sie, dass Ihre Umwandlung von Grad in Bogenmaß kann nie exakt sein (es geht etwas mit
π
). Sie sollten eine gewisse Toleranz in Ihren tests. Auch, wenn Siedouble
stattfloat
für dieradians
-, Sie haben einige zusätzliche Präzision in der Mittelstufe Berechnung.Sin
undCos
Sie können nicht erwarten, dass exakte Werte. Die Werte müssen sehr nah an dem erwarteten Wert, obwohl.Als ich sah, dass meine unit-tests fehlschlagen, bin ich davon ausgegangen, dass dies schlecht war. Sie weisen jedoch darauf hin, dies ist bis auf Rundungsfehler, die wie es sich herausstellt sind auch innerhalb einer nutzbaren Toleranz. Vielen Dank 🙂
Es gibt wirklich acht unterschiedliche "Konventionen" für (ein), die "Ecke" (Kreuzung zwischen einer Achse und der Einheit-Kreis) zum starten aus (4 Möglichkeiten) und (b), in welche Richtung (im Uhrzeigersinn oder gegen den Uhrzeigersinn) zu verwenden (2 Möglichkeiten). Das entspricht der acht Möglichkeiten auswählen (ich), um von
Cos
undSin
(Cos
ersten (x), dannSin
(y), oder Umgekehrt), (II.) - Zeichen (minus-oder nicht) auf die erste Koordinate, und (iii) - Zeichen auf der letzten Koordinate.FWIW, ich habe aktualisiert mein Exemplar von NUnit-und nun rufen neue überladungen der AreEqual die Toleranzen. Ich habe In diesem Fall erlaubt Toleranzen von 0.00001. Dies erscheint mehr als ausreichend. Noch einmal vielen Dank @Jeppe für deine Hilfe 🙂
InformationsquelleAutor Jeppe Stig Nielsen