Хорошо,
У меня есть снаряд, чье положение определено так:
a.x = initialX + initialDX * time;
a.y = initialY + initialDY * time + 0.5 * gravtiy * time^2;
Я хочу иметь возможность предсказать, с какими препятствиями в моем окружении столкнется этот снаряд.Я планирую проверить расстояние от A до ближайшей точки кривой до точки P .
Я рассчитываю, что в точке A касательная к кривой будет перпендикулярна вектору AP , и что касательная к кривой в A будет просто скоростью V снаряда вэтот момент.
AP точка V = 0
ap.x = initialX + initialDX * time - p.x;
ap.y = initialY + initialDY * time + gravity * time^2 - p.y;
v.x = initialDX;
v.y = initialDY + gravity * time;
=>
AP точка V =
( 0.5 * gravity^2 ) * t^3 +
( 1.5 * gravity * initialDY ) * t^2 +
( initialDX^2 + initialDY^2 + gravity * ( initialY - p.y ) ) * t +
( initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y ) )
Отсюда видно, что это кубическая функция.Я потратил некоторое время на исследования в Интернете и обнаружил, что существует общее уравнение, которое, кажется, работает для определенных значений при поиске корней.
Это процесс, который я пытался реализовать.http://www.sosmath.com/algebra/factor/fac11/fac11.html
a = 0.5 * gravity^2;
b = 1.5 * gravity * initialDY;
c = initialDX^2 + initialDY^2 + gravity * ( initialY - p.y );
d = initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y );
A = ( c - ( b * b ) / ( 3 * a ) ) / a;
B = -( d + ( 2 * b * b * b ) / ( 27 * a * a ) - ( b * c ) / ( 3 * a ) ) / a;
workingC = -Math.pow( A, 3 ) / 27;
u = ( -B + Math.sqrt( B * B - 4 * workingC ) ) / 2; // Quadratic formula
s = Math.pow( u + B, 1 / 3 );
t = Math.pow( u, 1 / 3 );
y = s - t;
x = y - b / ( 3 * a );
Когда я снова подключу x к своим исходным уравнениям для кривой как времени, это должно дать мне A .Похоже, что это хорошо работает для определенных значений, однако, когда py выше определенного значения, у меня нет положительного, чтобы взять квадратный корень из квадратного уравнения.
У меня не достаточно полнопонимание математики, чтобы понять, почему это происходит, или что я могу сделать, чтобы решить эту проблему.
Любая помощь по этому вопросу будет принята с благодарностью.
ОБНОВЛЕНИЕ:
Я настроил свой алгоритм для работы со сложными корнями, но у меня все еще проблемы.Это то, что я делаю сейчас, если дискриминант отрицательный:
a = 0.5 * gravity^2;
b = 1.5 * gravity * initialDY;
c = initialDX^2 + initialDY^2 + gravity * ( initialY - p.y );
d = initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y );
A = ( c - ( b * b ) / ( 3 * a ) ) / a;
B = -( d + ( 2 * b * b * b ) / ( 27 * a * a ) - ( b * c ) / ( 3 * a ) ) / a;
workingC = -Math.pow( A, 3 ) / 27;
discriminant = B * B - 4 * workingC;
then if discriminant < 0;
uc = new ComplexNumber( -B / 2, Math.sqrt( -discriminant ) / 2 );
tc = uc.cubeRoot( );
uc.a += B;
sc = uc.cubeRoot( );
yc = sc - tc;
yc.a -= b / ( 3 * a );
x = -d / ( yc.a * yc.a + yc.b * yc.b );
По какой-то причине это все еще не дает ожидаемых результатов.Есть ли что-то, что выделяется здесь как неправильное?