无法实现 GJK 距离算法

Posted

技术标签:

【中文标题】无法实现 GJK 距离算法【英文标题】:Can't implement GJK distance algorithm 【发布时间】:2016-12-05 05:35:00 【问题描述】:

我正在尝试从头开始设计自己的物理引擎以及向量/矩阵库。 到目前为止,一切都很顺利,直到我尝试在我的库中实现碰撞检测。首先使用 SAT,它非常适合检测,但我也想找到物体之间的距离。然后我尝试实现GJK距离算法,只是为了看看我是否可以找到原点和多边形之间的距离。但这不起作用,我实现的算法感知的最小距离是多边形的顶点之一:

我知道我是从头开始制作其他库的,但我很肯定它们正在工作。无论如何,这是我实现 GJK 的代码:

    #objectL[0] is a hexagon
    v = objectL[0].nodes[0]
    W = []
    u = 0
    close_enough = False
    while not close_enough and v != Vector(0,0): 
        w = objectL[0].support(-v)  
        d = v*w/abs(v)  #*:dot product abs:magnitude
        u = max(u,d)
        close_enough = abs(v) - u <= 0.0001
        if not close_enough:
            W.append(w)
            while len(W)>2:
                del W[0]
            v = Vector(0,0).vectorToLine(*W) #distance from the origin to the simplex
                                             #formed by W

现在支持方法:

    def support(self,axis):
    maxP = self.nodes[0]*axis  #dot product of first vertex with the axis
    n = self.nodes[0]
    for node in self.nodes[1:]:
        p = node*axis
        if p>maxP:
            maxP = p
            n = node
    return node

这些是代码 sn-ps,我认为是错误所在,但我找不到。我从here 复制的 GJK 算法。谢谢!

编辑: Here是我的项目(在pygame中实现)

【问题讨论】:

有趣的算法,以前没听说过,但似乎非常有用!你看过this链接吗?看起来他们在代码中为距离部分实现了算法,即使它不在 python 中。 【参考方案1】:

好的,找到错误了。这不是在实现上,而是在我之前创建的函数上:支持,它返回 node 而不是 nvectorToLine 函数,它返回一个不正确的向量(负值)。

对于那些从现在开始阅读这篇文章并尝试实现此算法的人,请注意我只将while len(W)&gt;2 部分更改为:

                while len(W)>2:
                maxD = 0
                for w in W:
                    if abs(w)>maxD:
                        maxD = w
                W.remove(maxD)

这会删除单纯形/三角形的最远点,因此它会获得两个最近点(到原点)以继续算法。

【讨论】:

以上是关于无法实现 GJK 距离算法的主要内容,如果未能解决你的问题,请参考以下文章

Atitti knn实现的具体四个距离算法 欧氏距离余弦距离汉明距离曼哈顿距离

如何在 sklearn 中使用 gower 距离实现 pam 聚类算法?

算法461. 汉明距离(多语言实现)

聚类算法中的四种距离及其python实现

最短编辑距离算法实现

C#实现Levenshtein distance最小编辑距离算法