2013-08-04 15 views
5

Ich versuche den Winkel zu berechnen, der erforderlich ist, um ein Projektil zu schießen, um eine bestimmte Koordinate zu treffen.Berechne den erforderlichen Winkel, um die Koordinate (x, y) von einer anderen Position als (0,0) mit unterschiedlicher Höhe zu treffen

Mein Projektil befindet sich eine zufällige Koordinate und meine Zielkoordinate an einer statischen Koordinate.

I beendet über die folgende Gleichung auf Wikipedia läuft Für die Berechnung der erforderlichen Winkel bei einer Koordinate (x, y) von (0,0) zu treffen:

Ich habe einige Versuche gemacht um diese und andere Formel zu verstehen und versuchte die folgende Implementierung (ich verwende C# und XNA).

double y = source.Y - target.Y; 
double x = Vector2.Distance(source, target); 
double v = 1440; //velocity 
double g = 25; //gravity 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
double angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

Ich habe auch folgendes versucht, was zu einem identischen Winkel führte, wo die Werte von v und g gleich bleiben.

double targetX = target.X - source.X; 
double targetY = -(target.Y - source.Y); 
double r1 = Math.Sqrt((v*v*v*v) - g*(g*(target.X*target.X) + ((2*target.Y)*(v*v)))); 
double a1 = ((v*v) + r1)/(g*target.X); 
angleInRadians = -Math.Atan(a1); 
if (targetX < 0) 
{ 
    angleInRadians -= 180/180*Math.PI; 
} 

Meine Vermutung ist, dass auch in meinem (angenommen) Versuch die Quelle Null aus koordinieren, dass ich noch nicht die Berechnung korrekt für Koordinaten mit einer nicht (0,0) Quelle und verschiedenen Höhen durchführt.

Unten ist ein Bild, das mein Koordinatensystem darstellt. Dies ist die Standardeinstellung für XNA.

+1

Ich denke, Sie sollten Ihre tatsächlichen Positionen (0,0) -basierten System zu übersetzen, führen die Funktion dort und führen Sie eine endgültige Übersetzung von (0,0) zum tatsächlichen System ... unter der Annahme, dass keine anderen Faktoren als die Schwerkraft vorhanden sind, sollte der berechnete Winkel von jeder Quelle gleich sein ... –

+0

Welche anderen Parameter (Eingabe) beeinflussen den Projektilpfad, wie die Geschwindigkeits- und Schwerkraftkonstanten oder welche anderen Variablen gibt es? –

+0

Sollte die Schwerkraft nicht negativ sein? Es ist -9.8m/s wenn ich mich richtig erinnere. –

Antwort

2

Dank der Hilfe in den Kommentaren der Lösung dieser Winkel zu finden, schließlich erfordern, dass die Positionen zu einem (0,0) basiertes System übersetzt werden. Für alle, die das gleiche Szenario suchen war die letzte Arbeitslösung:

double x = -(source.x - target.x); 
double y = (source.y - target.y); 
double v = 1440; //m/s 
double g = 25; //m/s 
double sqrt = (v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v))); 
sqrt = Math.Sqrt(sqrt); 
angleInRadians = Math.Atan(((v*v) + sqrt)/(g*x)); 

dann den Radianten in einen Vektor zu konvertieren, die mit XNA funktioniert, führen Sie die folgende Umwandlung:

Vector2 angleVector = new Vector2(-(float)Math.Cos(angleInRadians), (float)Math.Sin(angleInRadians)); 
+0

Für den Datensatz, wenn jemand darüber stolpert und es nützlich findet: Der Rückgabewert ist ein normalisierter Vektor. In meinem Fall musste ich nur mit Geschossmündungsgeschwindigkeit skalieren. mit Java/libgdx: 'return angleVector.scl ((float) RifleBullet.projectileSpeed);' – Jarmund

1

denke ich, das eigentliche Problem liegt in der Verwendung von Arctan. Da der Bereich auf -pi/2 beschränkt ist, sind die Ergebnisse nur in der rechten Halbebene.

Verwenden arctan2 die richtigen Koordinaten erhalten:

angleInRadians = Math.Atan2(((v*v) + tmp), (g*x));