我目前正在尝试在C中开发一个例程,它应该确定两个轴对齐的椭球是否发生碰撞。我目前的方法是对每个椭球使用4维矩阵表示(让我们称之为矩阵A和B),然后使用f(n)= det(A + n * B)计算特征多项式。我还假设椭圆体B的中心位于(0,0,0),以简化一些事情。然后,得到的行列式变为this expression。
(a,b,c)是A的半轴和(d,e,f)B的半轴。(x,y,z)是它们之间的距离矢量。
我计算了特征多项式,然后使用Wolfram Alpha(我也按手工完成,但表达式开始填充几乎整页)并获得特征方程here的结果。
我现在使用以下C代码表达式:
double abc2 = a2 * b2 * c2;
double def2 = d2 * e2 * f2;
double bcd2 = b2 * c2 * d2;
double ace2 = a2 * c2 * e2;
double abf2 = a2 * b2 * f2;
double cde2 = c2 * d2 * e2;
double bdf2 = b2 * d2 * f2;
double aef2 = a2 * e2 * f2;
double c_4 = abc2;
double c_3 = x2*b2*c2 + bcd2 + y2*a2*c2 + ace2 + z2*a2*b2 + abf2 - abc2;
double c_2 = x2*c2*e2 + y2*c2*d2 + cde2 + x2*b2*f2 + z2*b2*d2 + bdf2 - bcd2 + y2*a2*f2 + z2*a2*e2 + aef2 - ace2 - abf2;
double c_1 = y2*e2*f2 + y2*d2*f2 + z2*d2*e2 + def2 - cde2 - bdf2 - aef2;
double c_0 = -def2;
其中a2,b2等被定义为相应值的平方。我还将特征多项式乘以所有平方半轴的乘积,以避免计算中的划分(这不会改变我的碰撞检测算法的结果)。然后我使用Sturm链的变体来计算正负根的数量。如果存在两个正根,则椭圆应该碰撞。
但不知怎的,我获得了无效的结果,例如,如果a = b = c = d = e = f = 1且(x,y,z)=(10,0,0),我得到一个正根和3消极的根源。然而,x = 1.9产生完全相同的根数(球体肯定会在那里碰撞),而x = 1.0例如给出一个正根和一个负根(我用Wolfram Alpha再次检查结果,这确实证实了那些)。
我不知道我的错误在哪里,因为我在2D中为椭圆实现了完全相同的ansatz算法并且它在那里工作得很好。但在3D中,结果是完全错误的,我找不到原因。我之前做过B的计算只是一个单位球(与上面的计算完全分开),但问题也出现在那里。
我希望,有人可以在这里指出我的错误或错误,因为我完全没有想法。
问候,Hadeweka