求解立方体以找到曲线上的最近点到点

时间:2010-07-13 22:46:01

标签: formula collision point closest cubic

确定,

我有一个弹丸,它的位置定义为:

a.x = initialX + initialDX * time;

a.y = initialY + initialDY * time + 0.5 * gravtiy * time^2;

我希望能够预测这个弹丸会与我的环境中的哪些障碍物碰撞。我打算检查从 A 到曲线上最近点到 P 点的距离。

我认为在 A 点,曲线的切线垂直于矢量 AP ,并且曲线的切线位于 A << / strong>将只是该点射弹的速度 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;

=&GT;

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 。这似乎适用于某些值,但是当p.y高于某个值时,我没有积极的方法来取二次方程中的平方根。

我对数学没有足够的理解,无法理解为什么会这样,或者我可以做些什么来解决这个问题。

对此的任何帮助都将非常感激。

更新:

我已经调整了算法以处理复杂的根,但是我仍然遇到了麻烦。 如果判别式是否定的,我现在就这样做了:

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 个答案:

答案 0 :(得分:4)

实数多项式可以具有复数根,如果根不是实数,则它们出现在共轭对中。

这意味着立方体总是至少有一个真正的根。

现在,如果你使用你的方法得到一个复杂的根,你可以尝试得到共轭,多重并除以立方的常数,取倒数得到真正的根。

因此,如果你必须取一个-ve数的平方根,那么它就等于将其模数的平方根乘以虚数'i'。

因此,如果您将根表示为(m,n),表示复数m + i n。那么另一个根是m - i n =(m,-n),m和n是实数。

然后可以将立方体写成P(x)=(x ^ 2 - 2m +(m ^ 2 + n ^ 2))(x-r)。

因此,如果P(x)= x ^ 3 - a_1 * x ^ 2 + a_2 * x - a_3,那么我们得到r = 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