我正在尝试实现Gilbert-Johnson-Keerthi距离算法(GJK),但我在“距离子算法”中遇到了问题,这也称为“约翰逊算法”,该算法用于确定简单形式上最接近原点的点。我得到了错误的结果,但是我找不到代码中的任何错误,所以问题必须在我的算法解释上。
在约翰逊算法中(如Gino van den Bergen的书《交互式3D环境中的碰撞检测》中所述),最靠近原点的简单形式的仿射包的点由以下公式给出:
在约翰逊算法中(如Gino van den Bergen的书《交互式3D环境中的碰撞检测》中所述),最靠近原点的简单形式的仿射包的点由以下公式给出:
X = {yi : i ∈ Ix}
。
Δi^X值是按X的基数递增的顺序递归确定的:
...并且Δ^X由以下给出:
对于二维,我使用以下方法找到距离原点最近的点:
Point ClosestPointToOrigin(Simplex simplex)
{
float dx = 0;
for (int i = 0; i < simplex.size(); ++i)
dx += dj(simplex, i);
Point closest_point(0,0);
for (int i = 0; i < simplex.size(); ++i)
closest_point += dj(simplex, i) / dx * simplex[i];
return closest_point;
}
其中Δi的值由以下确定:
float dj(Simplex simplex, int j)
{
if (j == 0)
{
return 1;
}
else
{
float d = 0;
for (int i = 0; i < j; ++i)
d += dj(simplex, i) * (simplex[0] - simplex[j]).dotProduct(simplex[i]);
return d;
}
}
对于一个二维单体 X = {y1, y2}
,其中y1 = (1,1)
,y2 = (1,-1)
,上面的代码返回(1.0,-0.333333)
,而最接近的点实际上是(1, 0)
。
我一定做错了什么,但我无法弄清楚是什么。
n
中,单形体应该有n+1
个顶点,所以在你的例子中缺少一个顶点,这可能会导致问题? - HoltI_x
和I_X
,或者Delta_i
(你定义了Delta_i^X
但没有定义Delta_i
)。 - Holt