Sie möchten den Winkel des Pfeils zu jedem Zeitpunkt. Sie haben sich daran erinnert, dass es zum Berechnen eines Winkels eine Tangente gibt. Aber hier begann Ihr Denken schief zu gehen:
- Was Sie wollen, ist Delta y / Delta x, weil die Steigung die Änderungsrate ist (in einer der anderen Antworten erwähnt). Beachten Sie, dass x nur die Position ist, an der Sie sich zu einem beliebigen Zeitpunkt befinden, nicht dx.
Wenn Sie also die Luftreibung vernachlässigen, ist die x-Geschwindigkeit des Pfeils eine Konstante.
Zerlegen Sie zunächst die Geschwindigkeit in x- und y-Komponenten. Sie könnten in einem Winkel von 45 Grad oder 60 Grad fotografieren. Sie brauchen also launchVelocity und einen Winkel, es ist kein Skalar.
Zweitens: Berechnen Sie alles als double, nicht als float. Sie sind nicht numerisch ausgereift genug, um zu wissen, wann ein Abrundungsfehler Sie nicht umbringt. Versuchen Sie es also nicht. Es ist auf keinen Fall eine große Zeitersparnis.
Drittens, verwenden Sie Math.pow nicht, es ist langsam und nicht so genau wie das Multiplizieren nach ganzzahligen Potenzen. Sie können auch viel Zeit sparen, indem Sie das Horner-Formular verwenden (siehe unten).
final double DEG2RAD = Math.PI/180;
double ang = launchAngle * DEG2RAD;
double v0x = launchVelocity * cos(ang); // initial velocity in x
double v0y = launchVelocity * sin(ang); // initial velocity in y
double x = (v0x * time);
// double y = (v0y * time) + (0.5 * g * (float)Math.Pow(time, 2));
double y = (0.5 * g * time + v0y) * time
Wenn Sie verzweifelt nach Leistung streben, können Sie sogar 0,5 * g vorberechnen, aber der obige Code bringt Sie zu 90% dorthin, ohne etwas zu Verrücktes zu tun. Wenn Sie das 10 Millionen Mal machen, ist es zwar nicht sehr viel Zeit, aber prozentual gesehen ist es ziemlich groß - Bibliotheken sind in Java sehr langsam
Wenn Sie also den Winkel möchten, in dem der Pfeil verlaufen soll, ist das, was Sie möchten
atan(dy/dx)
Und in diesem Fall würde das funktionieren, weil dx eine Konstante ist. Im Allgemeinen kann dx aber auch Null sein, weshalb Sie normalerweise Folgendes verwenden möchten:
atan2(dy, dx)
Diese Funktion wurde speziell für diesen Job entwickelt.
Aber wie gesagt, Bibliotheksfunktionen in Java sind schrecklich langsam, und in diesem Fall gibt es eine bessere Möglichkeit, ohne @FxIII darauf hinzuweisen.
Wenn die horizontale Geschwindigkeit immer v0x ist und die vertikale Geschwindigkeit ist:
double vy = v0y - 0.5 * g * time;
dann ist dein Delta: vx, vy
Du brauchst den Winkel nicht. Wenn Sie einen Pfeil zeichnen möchten, verwenden Sie nominell Folgendes:
Diagramm (x, y, x + vx, y + vy);
Ich weiß nicht, was Sie zeichnen. Wenn Sie also den Winkel zum Drehen benötigen (wie bei JOGL), verwenden Sie diesen Winkel.
Vergessen Sie nicht, wenn Sie opengl verwenden, um den Winkel wieder in Grad umzuwandeln, da ATAN2 Radiant zurückgibt:
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;