어느 시점에서든 화살표 각도를 원합니다. 각도를 계산하기 위해 접선이 있다는 것을 기억했습니다. 그러나 당신의 생각이 잘못되기 시작한 곳은 다음과 같습니다.
- 기울기가 변화율이기 때문에 원하는 것은 델타 y / 델타 x입니다 (다른 답변 중 하나에서 언급). x는 dx가 아닌 특정 시점의 위치입니다.
공기 마찰을 무시하면 화살표의 x- 속도는 일정합니다.
먼저, 속도를 x와 y 성분으로 분해하십시오. 45도 또는 60도 각도로 촬영할 수 있습니다. 따라서 launchVelocity와 각도가 필요합니다. 스칼라가 아닙니다.
둘째, 모든 것을 float가 아닌 double로 계산하십시오. 반올림 오류가 당신을 죽이지 않을 때를 알기에 충분히 정교하지는 않으므로 시도하지 마십시오. 어쨌든 시간을 절약하는 것은 아닙니다.
셋째, Math.pow를 사용하지 마십시오. 정수를 곱하는 것만 큼 느리고 정확하지 않습니다. 또한 Horner의 양식을 사용하여 많은 시간을 절약 할 수 있습니다 (아래 참조).
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
성능에 필사적 인 경우 0.5 * g를 사전 계산할 수도 있지만 위의 코드는 너무 미친 짓을하지 않고도 90 %의 방법을 사용합니다. 원하는 경우이 천만 번을 수행하는 벤치 마크는 시간이 많지 않지만 백분율로 보면 상당히 큽니다 .Java에서 라이브러리가 매우 느립니다.
따라서 화살표의 각도를 원한다면 원하는 것은
atan(dy/dx)
그리고이 경우에는 dx가 상수이기 때문에 작동합니다. 그러나 일반적으로 dx는 0이 될 수 있으므로 일반적으로 다음을 사용하려고합니다.
atan2(dy, dx)
이 작업을 위해 특별히 설계된 기능입니다.
그러나 내가 말했듯이 Java의 라이브러리 함수는 엄청나게 느리며,이 경우 위의 @FxIII에서 언급하지 않고 더 좋은 방법이 있습니다.
수평 속도가 항상 v0x이고 수직 속도가 다음과 같은 경우
double vy = v0y - 0.5 * g * time;
다음 델타는 : vx, vy
각도가 필요하지 않습니다. 화살표를 그리려면 명목상 다음과 같은 것을 사용하십시오.
음모 (x, y, x + vx, y + vy);
나는 당신이 무엇을 그리는지 모른다. 따라서 JOGL을 사용하는 것처럼 회전하기 위해 각도가 필요하다면 각도를 사용하십시오.
ATAN2는 라디안을 반환하므로 opengl을 사용하여 각도를 다시 각도로 돌리는 것을 잊지 마십시오.
final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;