formula - 求解三次方以找到曲线上距离点最近的点

标签 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

APV = 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;

=>

APV =

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

出于某种原因,这仍然没有给我预期的结果。这里有什么明显的错误吗?

最佳答案

实数多项式可以有复数根,如果根不是实数,它们会以共轭对的形式出现。

这意味着三次方总是至少有一个实根。

现在如果你用你的方法得到一个复根,你可以尝试得到共轭,乘除三次常数,取倒数得到实根。

因此,如果您必须对 -ve 数求平方根,则等于将其模数的平方根乘以虚数“i”。

因此,如果您将根表示为 (m,n),表示复数 m + in。那么另一个根就是m - in = (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)。

checkout :http://en.wikipedia.org/wiki/Complex_number

关于formula - 求解三次方以找到曲线上距离点最近的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3242151/

相关文章:

c# - SetActive 在 Unity3d 中不起作用?

python - 基于距离的点列表排序函数

java - 使用 TIMESTAMPDIFF 的 JPA Hibernate 公式中的 SQL 文字

c++ - Haversine公式-数学略有偏离,不确定为什么

python - pygame中的碰撞

datetime - 如何计算预期碰撞频率

mysql - PHP PDO 在 Mysql 中插入 Longditude/latituded 并在插入前检查是否存在

多边形内的 mysql 查询点 - 无结果

r - 定义在公式中使用的中缀运算符

python - 莱布尼茨行列式公式复杂度