Auf das Thema antworten  [ 1 Beitrag ] 
Punkt mithilfe Winkel und Entfernung berechnen 
Autor Nachricht
Administrator
Benutzeravatar

Registriert: Sa 15. Dez 2012, 19:15
Beiträge: 137
Wohnort: Karlsruhe
Mit Zitat antworten
Hallo Leute!
Die Tage habe ich ein paar mathematische Probleme aus meinem Projekt EnergyBowl endgültig lösen können. Dazu gehörten Tücken bei der Rotation, das Errechnen eines Punktes mithilfe eines Winkels und einer Entfernung und die korrekte Berechnung eines Winkels. In diesem Thema geht es um die korrekte Berechnung eines Winkels und eines Punktes mithilfe eines Winkels und einer Entfernung.

Es gibt drei Methoden, die uns bei der Bewältigung dieser Aufgaben behilflich sein werden.

Berechnung des Winkels
Code:
 
/// <summary>
/// Berechnet den Winkel zwischen zwei Punkten, wobei 0 oben ist, 90 rechts in DEG
/// </summary>
/// <returns>Winkel in RAD</returns>
internal static double Angle(Vector2 start, Vector2 ziel)
{
        return Angle(ziel.X - start.X, ziel.Y - start.Y);
}
/// <summary>
/// Berechnet den Winkel mithilfe DeltaX und DeltaY, wobei 0 oben ist, 90 rechts in DEG
/// </summary>
/// <returns>Winkel in RAD</returns>
internal static double Angle(float difX, float difY)
{
        return Math.Atan2(difY, difX) + (Math.PI / 2.00);
}
 

Ein Kreis in RAD ist 2 * PI groß, in DEG hingegen hat er 360 Grad. Gearbeitet wird in C# grundsätzlich mit RAD.


Entfernung zwischen zwei Punkten
Code:
 
/// <summary>
/// Berechnet die Entfernung zwischen zwei Punkten.
/// </summary>
/// <returns>Entfernung in double</returns>
internal static double Distance(Vector2 a, Vector2 b)
{
        return Math.Sqrt(Math.Pow(a.X - b.X, 2) + Math.Pow(a.Y - b.Y, 2));
}
 

Einfache Anwendung des Satz von Pythagoras.


Berechnung des Punktes mit Winkel und Entfernung
Code:
 
/// <summary>
/// Berechnet den neuen Punkt mithilfe Winkel und Entfernung.
/// </summary>
/// <param name="start">Startpunkt</param>
/// <param name="angle">Winkel in RAD</param>
/// <param name="distance">Entfernung (Radius)</param>
/// <returns>Neuer Punkt</returns>
internal static Vector2 Point(Vector2 start, float angle, float distance)
{
        Vector2 delta = Point(angle, distance);
        return new Vector2(start.X + delta.X, start.Y + delta.Y);
}
/// <summary>
/// Berechnet DeltaX und DeltaY mithilfe Winkel und Entfernung.
/// </summary>
/// <param name="angle">Winkel in RAD</param>
/// <param name="distance">Entfernung (Radius)</param>
/// <returns>DeltaX und DeltaY</returns>
internal static Vector2 Point(float angle, float distance)
{
        return new Vector2((float)Math.Sin(angle) * distance, -(float)Math.Cos(angle) * distance);
}
 


Die zweite Methode kann auch wunderbar dazu verwendet werden um einen Bewegungsvektor zu erhalten. Das ist DIE eine Lösung, die ich so nie gefunden habe. Ich hoffe, ich kann euch nun einigen Ärger ersparen. Eine beispielhafte Anwendung für diese Methode wäre z.B. ein Streuschuss.


Schöne Grüße,
Magony

_________________
Bei Fragen, Lob, Kritik, Vorschläge, hilfreiche Hinweise oder Alternativvorschläge: Beitrag, neues Thema oder PN.
Für Dinge die diskutiert werden sollten, bitte neues Thema im jeweiligen Forum.
Wenn du nicht weißt wohin: Forum Unsortiert.


Sa 13. Apr 2013, 22:12
Diesen Beitrag melden
Profil Website besuchen
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Auf das Thema antworten   [ 1 Beitrag ] 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst neue Themen in diesem Forum erstellen.
Du darfst Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software
Deutsche Übersetzung durch phpBB.de

Impressum