Решение кубики, чтобы найти ближайшую точку на кривой к точке - PullRequest
3 голосов
/ 14 июля 2010

Хорошо,

У меня есть снаряд, чье положение определено так:

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 ); 

По какой-то причине это все еще не дает ожидаемых результатов.Есть ли что-то, что выделяется здесь как неправильное?

1 Ответ

4 голосов
/ 14 июля 2010

Реальные полиномы могут иметь корни комплексных чисел, и если корни не являются реальными, они встречаются в сопряженных парах.

Это означает, что кубики всегда имеют хотя бы один действительный корень.

Теперь, если выполучить сложный корень с помощью вашего метода, вы можете попытаться получить сопряженное, многозначное и разделить константу кубической, взять обратный, чтобы получить реальный корень.

Так что, если вам пришлось взять квадратный корень из-ve число, то это то же самое, что умножить квадратный корень его модуля на мнимое число «i».

Так что, если вы представляете свой корень как (m, n), обозначающий комплексное число m + i п.Тогда другой корень - это m - i n = (m, -n), а m и n - действительные числа.

Куб можно записать как P (x) = (x ^ 2 -2m + (m ^ 2 + n ^ 2)) (xr).

Так что, если P (x) = x ^ 3 - a_1 * x ^ 2 + a_2 * x - a_3, то имеем= a_3 / (m ^ 2 + n ^ 2) (a_3 - произведение корней, то есть r (m ^ 2 + n ^ 2))

Более простой способ получить r - использоватьформула r = a_1 - 2m (a_1 - сумма корней, которая равна r + 2m).

Выезд: http://en.wikipedia.org/wiki/Complex_number

...