碰撞检测GJK算法论文解析三

  • 再探Appendix Ⅱ
    • 内容详解
  • 再探The Distance Subalgorithm
    • 内容详解
      • 过程1
      • 过程2
      • 过程3

这里要先纠正上篇文章的一些错误,就是上篇文章的最后其实并没有证明定理3,而只是给出了仿射集系数向量 λ\lambdaλ的解的形式,而没有进一步说明如何从定理3的各个条件推导出结论;然后是之前把余子式和代数余子式的概念混杂在一起了,所以文中有些描述也错了。对于以上两点疏忽,我向大家道个歉。我修改了上篇文章的一些描述,整体内容没有变化,所以这篇文章继续从附录二开始,然后讲完第五部分。
为防止混乱,我这里先说明一下,文章内有时候会用 yiy_iyi​表示点,有时候又会用 xix_ixi​表示点,但无论如何,只要是同一类型的符号就代表是在同一个集合内的,关键是抓住定义,所以不用纠结用的是哪一个符号。

再探Appendix Ⅱ

内容详解

在上一篇文章的最后,我们得到了仿射集系数λi\lambda^iλi的形式,即下式:
λi=Δi(YS)/Δ(YS)\lambda^i = \Delta_i(Y_S) / \Delta(Y_S) λi=Δi​(YS​)/Δ(YS​)然后进入引理1的分析。
引理1:当且仅当YSY_SYS​是仿射独立时,行列式Δ(YS)>0\Delta(Y_S) \gt 0Δ(YS​)>0。要证明这条引理,首先需要回顾(40)式和(41)式:

然后将ASA_SAS​第一列除第一个元素外都变成0,也就是论文里提到的第二行之后每一行加上(x1−xi)⋅x1(x_1 - x_i) · x_1(x1​−xi​)⋅x1​(看到(x1−xi)⋅x1(x_1 - x_i) · x_1(x1​−xi​)⋅x1​和第一列的元素有什么区别吗?就是差一个负号)。这样的话ASA_SAS​就会变成下面的矩阵:
∣11...10(x2−x1)⋅x2−(x2−x1)⋅x1...(x2−x1)⋅xr−(x2−x1)⋅x1............0(xr−x1)⋅x2−(xr−x1)⋅x1...(xr−x1)⋅xr−(xr−x1)⋅x1∣=∣11...10(x2−x1)⋅(x2−x1)...(x2−x1)⋅(xr−x1)............0(xr−x1)⋅(x2−x1)...(xr−x1)⋅(xr−x1)∣\begin{vmatrix} 1 & 1 & ... & 1 \\ 0 & (x_2 - x_1)·x_2- (x_2 - x_1)·x_1& ... & (x_2 - x_1)·x_r- (x_2 - x_1)·x_1\\ ...& ... & ... & ...\\ 0 & (x_r - x_1)·x_2- (x_r - x_1)·x_1 & ... & (x_r - x_1)·x_r- (x_r - x_1)·x_1 \end{vmatrix} = \\ \begin{vmatrix} 1 & 1 & ... & 1 \\ 0 & (x_2 - x_1)·(x_2-x_1)& ... & (x_2 - x_1)·(x_r- x_1)\\ ...& ... & ... & ...\\ 0 & (x_r - x_1)·(x_2- x_1) & ... & (x_r - x_1)·(x_r- x_1) \end{vmatrix} ∣∣∣∣∣∣∣∣​10...0​1(x2​−x1​)⋅x2​−(x2​−x1​)⋅x1​...(xr​−x1​)⋅x2​−(xr​−x1​)⋅x1​​............​1(x2​−x1​)⋅xr​−(x2​−x1​)⋅x1​...(xr​−x1​)⋅xr​−(xr​−x1​)⋅x1​​∣∣∣∣∣∣∣∣​=∣∣∣∣∣∣∣∣​10...0​1(x2​−x1​)⋅(x2​−x1​)...(xr​−x1​)⋅(x2​−x1​)​............​1(x2​−x1​)⋅(xr​−x1​)...(xr​−x1​)⋅(xr​−x1​)​∣∣∣∣∣∣∣∣​等式的右边是不是很有规律?它可以变成QSTQSQ^T_SQ_SQST​QS​,其中QSQ_SQS​是矩阵:

这里要注意,xix_ixi​是列主序的向量,所以QSQ_SQS​确实是一个矩阵。当然你可以把xix_ixi​都拆开再进行矩阵的乘法,不过得到的是一样的结果。根据行列式的计算公式有:det(AS)=det(QSTQS)det(A_S) = det(Q^T_SQ_S)det(AS​)=det(QST​QS​),所以det(AS)⩾0det(A_S) \geqslant 0det(AS​)⩾0,并且矩阵rank(AS)=rank(QS)rank(A_S) = rank(Q_S)rank(AS​)=rank(QS​)(rank代表矩阵的秩),如果det(AS)>0det(A_S) \gt 0det(AS​)>0那么代表rank(AS)=rank(QS)=r−1rank(A_S) = rank(Q_S) = r-1rank(AS​)=rank(QS​)=r−1,又因为矩阵ASA_SAS​内的元素是集合YSY_SYS​内的点的线性组合,那么必然有dimY=r−1dim Y = r - 1dimY=r−1。回到第一篇文章,我们可以知道,如果dimaffY=dimY=r−1dim \space aff Y = dim Y= r - 1dim affY=dimY=r−1,那么说明YSY_SYS​是仿射独立的。至此,引理1证明完毕。
之前提到(30)式有很多新出现的符号,我们还未了解,所以不讲。但是现在我们已经有足够的知识去理解了,而且接下来的内容也需要用到(30)式,所以接下来先返回到第五部分的(30)式,梳理完之后会回到第五部分,这里主要是接着上面的思路,所以没有把(30)式的分析放到第五部分。
(30)式内容如下:

这里面有三个式子,这里分别称为30.1、30.2以及30.3。(30.1)式我自己是觉得有点疑惑的,与其说是公式,不如说是补充定义,因为只有一个点的话计算这个值也没有什么意义。(30.3)式应该比较好理解,这个就是使用代数余子式计算行列式的公式。关键是(30.2)式,简单来说就是按照(41)式的规律,往ASA_SAS​矩阵加入yjy_jyj​向量后,再取第一行yjy_jyj​那列的代数余子式,这里以2阶的ASA_SAS​矩阵为例
AS=∣11(y2−y1)⋅y1(y2−y1)⋅y2∣A_S = \begin{vmatrix} 1 & 1 \\ (y_2 - y_1)·y_1 & (y_2 - y_1)·y_2 \end{vmatrix} AS​=∣∣∣∣​1(y2​−y1​)⋅y1​​1(y2​−y1​)⋅y2​​∣∣∣∣​那么加入yjy_jyj​后的矩阵ASjA^j_SASj​则为:
ASj=∣111(y2−y1)⋅y1(y2−y1)⋅y2(y2−y1)⋅yj(yj−y1)⋅y1(yj−y1)⋅y2(yj−y1)⋅yj∣A^j_S= \begin{vmatrix} 1 & 1 & 1 \\ (y_2 - y_1)·y_1 & (y_2 - y_1)·y_2 & (y_2 - y_1)·y_j \\ (y_j - y_1)·y_1 & (y_j - y_1)·y_2 & (y_j - y_1)·y_j \\ \end{vmatrix}ASj​=∣∣∣∣∣∣​1(y2​−y1​)⋅y1​(yj​−y1​)⋅y1​​1(y2​−y1​)⋅y2​(yj​−y1​)⋅y2​​1(y2​−y1​)⋅yj​(yj​−y1​)⋅yj​​∣∣∣∣∣∣​
然后根据上一篇文章的内容,可以知道:
Δj(YS⋃{yj})=(−1)(1+3)det∣(y2−y1)⋅y1(y2−y1)⋅y2(yj−y1)⋅y1(yj−y1)⋅y2∣\Delta_j(Y_S \bigcup \lbrace y_j \rbrace) = (-1)^{(1 + 3)}det\begin{vmatrix} (y_2 - y_1)·y_1 & (y_2 - y_1)·y_2 \\ (y_j - y_1)·y_1 & (y_j - y_1)·y_2 \\ \end{vmatrix} Δj​(YS​⋃{yj​})=(−1)(1+3)det∣∣∣∣​(y2​−y1​)⋅y1​(yj​−y1​)⋅y1​​(y2​−y1​)⋅y2​(yj​−y1​)⋅y2​​∣∣∣∣​如果取最后一行的代数余子式来进行行列式计算,那么:
Δj(YS⋃{yj})=(−1)(1+3)∗(−1)(1+2)((yj−y1)⋅y1)((y2−y1)⋅y2)+(−1)(1+3)∗(−1)(1+3)((yj−y1)⋅y2)((y2−y1)⋅y1)(a)\Delta_j(Y_S \bigcup \lbrace y_j \rbrace) = (-1)^{(1 + 3)}* (-1)^{(1 + 2)}((y_j - y_1)·y_1)((y_2 - y_1)·y_2) + (-1)^{(1 + 3)}* (-1)^{(1 + 3)}((y_j - y_1)·y_2)((y_2 - y_1)·y_1) \kern3em \lparen a \rparen Δj​(YS​⋃{yj​})=(−1)(1+3)∗(−1)(1+2)((yj​−y1​)⋅y1​)((y2​−y1​)⋅y2​)+(−1)(1+3)∗(−1)(1+3)((yj​−y1​)⋅y2​)((y2​−y1​)⋅y1​)(a)然后我们仔细分析一下上面这个式子,有没有发现,其实Δ1YS=(−1)(1+1)((y2−y1)⋅y2)\Delta_1Y_S=(-1)^{(1 + 1)}((y_2 - y_1)·y_2)Δ1​YS​=(−1)(1+1)((y2​−y1​)⋅y2​)而Δ2YS=(−1)(1+2)((y2−y1)⋅y1)\Delta_2Y_S=(-1)^{(1 + 2)}((y_2 - y_1)·y_1)Δ2​YS​=(−1)(1+2)((y2​−y1​)⋅y1​)
那么(a)式可以写成:
Δj(YS⋃{yj})=−1∗Δ1YS((yj−y1)⋅y1)+(−1)∗Δ2YS((yj−y1)⋅y2)\Delta_j(Y_S \bigcup \lbrace y_j \rbrace) = -1*\Delta_1Y_S((y_j - y_1)·y_1) + (-1)*\Delta_2Y_S((y_j - y_1)·y_2) Δj​(YS​⋃{yj​})=−1∗Δ1​YS​((yj​−y1​)⋅y1​)+(−1)∗Δ2​YS​((yj​−y1​)⋅y2​)这个就是(30.2)式!理解(30.2)式非常重要,因为这是证明定理3的一个关键。想要进一步熟悉的不妨推导一下4阶的ASA_SAS​矩阵。

再探The Distance Subalgorithm

内容详解

有了上面几篇文章的基础,现在我们终于能去证明定理3了,这真的是一个漫长的过程,但也代表我们快要看到曙光了。这一部分虽然是在说第五部分,但是实际上证明的主题还是在附录二上,这样安排是为了思路能够更加连贯(我自己也不想每隔几行就插个标题,然后跳来跳去)。首先我们来看一下定理3的描述。
定理3:当且仅当
\kern3em 1)Δ(YS)>0\Delta(Y_S) \gt 0Δ(YS​)>0;
\kern3em 2)∀i∈IS,Δi(YS)>0\forall i \in I_S,\Delta_i(Y_S) \gt 0∀i∈IS​,Δi​(YS​)>0;
\kern3em 3)∀i∈IS′,Δj(YS⋃{yj})⩽0\forall i \in I_S',\Delta_j(Y_S \bigcup \lbrace y_j \rbrace) \leqslant 0∀i∈IS′​,Δj​(YS​⋃{yj​})⩽0
时,集合YYY的凸包离原点最近的点能够以(29)式的形式进行表示。这里要注意的是IS′I_S'IS′​表示的是ISI_SIS​的补集,也就是说如果Y={y1,y2,y5,y6}Y = \lbrace y_1, y_2, y_5, y_6\rbraceY={y1​,y2​,y5​,y6​},那么I={1,2,5,6}I = \lbrace 1, 2, 5, 6\rbraceI={1,2,5,6},然后YS={y1,y5,y6}Y_S = \lbrace y_1, y_5, y_6\rbraceYS​={y1​,y5​,y6​},那么IS={1,2,6}I_S = \lbrace 1, 2, 6\rbraceIS​={1,2,6},IS′={5}I_S' = \lbrace 5 \rbraceIS′​={5}。下面是证明过程。

过程1

首先是根据(41)式,当且仅当下面式子成立:
y⋅(y−yk)=0∀k∈IS(43)y · (y - y_k) = 0 \space \space \forall k \in I_S \kern3em \lparen 43\rparen y⋅(y−yk​)=0  ∀k∈IS​(43)才有y=v(affYS)y =v(aff\space Y_S)y=v(aff YS​)。这怎么得到的?我们回到(41)式,然后用ASA_SAS​矩阵的第二行去和λ\lambdaλ向量相乘,得到:
λ1(x2−x1)⋅x1+λ2(x2−x1)⋅x2+...+λr(x2−x1)⋅xr=0\lambda^1 (x_2 - x_1)·x_1 + \lambda^2 (x_2 - x_1)·x_2 + ... +\lambda^r (x_2 - x_1)·x_r = 0 λ1(x2​−x1​)⋅x1​+λ2(x2​−x1​)⋅x2​+...+λr(x2​−x1​)⋅xr​=0合并一下多项式,得到:
(λ1x1+λ2x2+...+λrxr)⋅(x2−x1)(\lambda^1 x_1 + \lambda^2 x_2 + ... +\lambda^r x_r)·(x_2 - x_1) (λ1x1​+λ2x2​+...+λrxr​)⋅(x2​−x1​)根据(12)式,以及yyy的定义,能得到:
y⋅(x2−x1)=0(1)\kern3em y·(x_2 - x_1) = 0 \kern3em(1)y⋅(x2​−x1​)=0(1)
同样的,我们能够得到以下式子:
y⋅(x3−x1)=0(2)\kern3em y·(x_3 - x_1) = 0 \kern3em(2)y⋅(x3​−x1​)=0(2)
...\kern3em\kern3em ......
y⋅(xr−x1)=0(r−1)\kern3em y·(x_r - x_1) = 0 \kern3em(r - 1)y⋅(xr​−x1​)=0(r−1)
然后将这r个式子乘以对应的系数λi+1\lambda^{i + 1}λi+1再相加,我们能得到:
y⋅(λ2x2+...λrxr−(λ2+...λr)x1)=0y·(\lambda^2x_2 + ...\lambda^rx_r - (\lambda^2+...\lambda^r)x_1) = 0 y⋅(λ2x2​+...λrxr​−(λ2+...λr)x1​)=0然后λ2x2+...λrxr=y−λ1x1\lambda^2x_2 + ...\lambda^rx_r = y - \lambda^1x_1λ2x2​+...λrxr​=y−λ1x1​,(λ2+...λr)=1−λ1(\lambda^2+...\lambda^r) = 1-\lambda^1(λ2+...λr)=1−λ1,综合这些式子就能得到(43)式,从而也说明了y=v(affYS)y =v(aff\space Y_S)y=v(aff YS​)。

过程2

设y=v(affYS)y =v(aff\space Y_S)y=v(aff YS​),并且假定定理3的1)和2)都满足,那么从引理1以及(42)式出发,我们可以用(29)式和(31)式来表示yyy,具体原因其实在文章叙述的过程中已经讲解了,这里就不再阐述。

过程3

定理3的条件1)和3)、(42)式加上(30)式表明y⋅(yk−yj)⩽0y · (y_k - y_j) \leqslant 0y⋅(yk​−yj​)⩽0,这个代入公式应该也不难理解,所以这里也不再阐述。
综合过程1、2、3,我们能得到以下信息:对于∀x∈coY\forall x \in coY∀x∈coY,我们有:
x=∑i=1vαiyi,∑i=1vαi=1,αi⩾0x = \sum^v_{i = 1}\alpha^iy_i, \space \sum^v_{i = 1}\alpha^i = 1, \alpha^i \geqslant 0 x=i=1∑v​αiyi​, i=1∑v​αi=1,αi⩾0这里的点的符号又变了,但不需要太纠结,抓住∀x∈coY\forall x \in coY∀x∈coY就好,上面的式子就是(12)式。那么我们可以得到下面的式子:
y⋅(y−x)=∑i=1vαiy⋅(y−yi)⩽0y·(y - x) = \sum^v_{i = 1}\alpha^iy·(y - y_i) \leqslant 0 y⋅(y−x)=i=1∑v​αiy⋅(y−yi​)⩽0然后我们根据(43)式可以知道上面的式子等于0,那么这代表了gcoY(y)=0g_{coY}(y) = 0gcoY​(y)=0,gK(x)g_K(x)gK​(x)的定义请参照(25)式,从而说明y就是离原点最近的点,即v(coY)=yv(co Y) = yv(coY)=y。
可能大家会有点晕,最后我梳理一下,简单来说就是使用定理3来找距离原点最近的点,就是上面提到的yyy,只要满足定理3,那么这个点就是我们要找的点。
那么,我们终于可以写出这个子算法的过程了:
Distance Subalgorithm:对有限集Y={y1,...,yv}⊂RmY = \lbrace y_1,...,y_v \rbrace \subset R^mY={y1​,...,yv​}⊂Rm,按一定的索引集构造集合YsY_sYs​,其中s=1,2,...,σs = 1, 2, ..., \sigmas=1,2,...,σ,σ\sigmaσ的定义为:
σ=∑k=1v[v!/(k!(v−k)!)]\sigma = \sum^v_{k = 1}[v! / (k!(v - k)!)] σ=k=1∑v​[v!/(k!(v−k)!)](这里要注意的是sss是一个数字,结合σ\sigmaσ的定义可知,在有4个点的情况下,我们可以设定s=1s=1s=1时,Ys={y1}Y_s=\lbrace y_1\rbraceYs​={y1​};s=2s=2s=2时,Ys={y2}Y_s=\lbrace y_2\rbraceYs​={y2​};s=15s=15s=15时,Ys={y1,y2,y3,y4}Y_s=\lbrace y_1, y_2, y_3, y_4\rbraceYs​={y1​,y2​,y3​,y4​}),然后按照下面的步骤进行处理:
\kern3em 1.s = 1;
\kern3em 2.如果YsY_sYs​中的顶点满足定理3的所有条件,那么使用(29)式以及(31)式对v(coY)v(coY)v(coY)进行表示并且返回结果;
\kern3em 3.如果s<σs \lt \sigmas<σ,那么s = s + 1,然后返回到步骤1继续执行;
\kern3em 4.如果上述步骤都没有得到结果,说明算法出了问题,返回错误。

到此,GJK的主要内容已经阐述得差不多了,后面我会把第六部分也梳理出来,第六部分主要是让整个算法更加健壮。然后我会加上一个简单的例子,让大家能更好的理解。

碰撞检测GJK算法论文解析三相关推荐

  1. 碰撞检测GJK算法论文解析二

    碰撞检测GJK算法论文解析二 The Theoretical Algorithm 内容详解 初探The Distance Subalgorithm 内容详解 Appendix Ⅱ 涉及的概念 内容详解 ...

  2. 碰撞检测GJK算法论文解析一

    碰撞检测GJK算法论文解析一 碰撞检测 Objcet Representation And Distance 1.涉及的概念 2.内容详解 Preliminaries 1.涉及的概念 2.内容详解 碰 ...

  3. 碰撞检测——GJK算法

    目录 碰撞检测--GJK算法 1.GJK算法的原理及思想 1.1 Minkowski Sum(明可夫斯基和) 1.2 Simplex 1.3 support函数 1.4 构建Simplex 2. GJ ...

  4. 【论文解读】Confluence:物体检测中不依赖IoU的NMS替代算法论文解析

    导读 基于IoU的NMS实际上是一种贪心算法,这种方法得到的结果往往不是最优的,Confluence给出了另一种选择. 论文地址:https://arxiv.org/abs/2012.00257 摘要 ...

  5. 前景检测算法论文解析之 HMMB(Real-Time Adaptive Histogram Min-MaxBucket)

    Real-Time Adaptive Histogram Min-MaxBucket (HMMB) Model forBackground Subtraction 简介 本文提出了一种高效的实时背景减 ...

  6. 感知算法论文(三):Feature Selective Anchor-Free Module for Single-Shot Object Detection

    文章目录 摘要 1. 引言 2. 相关工作 3. Anchor-free特征选择模型 3.1 网络结构 3.2 Ground-truth 和 loss 3.3 在线特征选择 3.4 Joint 推断和 ...

  7. 计算机图形学碰撞检测,碰撞检测——GJK算法

    基本概念 闵可夫斯基差(Minkowski difference) 凸体 和 两个物体相交,当且仅当其闵可夫斯基差包含原点. 单纯形(simplex) 这里相当于在闵可夫斯基差内迭代形成一个多面体,且 ...

  8. 【运筹优化】凸多面体重叠判断算法:GJK 算法详解 C++代码实现二维情形的凸多边形重叠判断

    文章目录 一.GJK 算法简介 二.前置知识 2.1 二维向量的点乘和叉乘 2.2 三维向量叉乘 2.3 凸多边形 2.4 闵可夫斯基差 2.5 单纯形 2.6 Support 函数 三.GJK 算法 ...

  9. CVPR2020论文解析:实例分割算法

    CVPR2020论文解析:实例分割算法 BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation 论文链接:https://arxiv ...

最新文章

  1. 阿里巴巴关于Java重要开源项目汇总
  2. android 继承dialog自定义对话框
  3. LCS最长公共子序列
  4. Jenkins部署:The username and password you provided are not correct (error 401)
  5. java 32 questions
  6. 求周期字符串的最小子串
  7. 单元测试java小白_一位Java应届毕业生工作7个月后的小结
  8. imagemagick, imagick和magickwand的安装
  9. ionic build android release,ionic build android -release运行报错
  10. 算法 Tricks(三)—— 判断序列是否为等差数列
  11. 提供三份程序员简历模板
  12. 360度反馈调查表中的问题示范
  13. PHP开发微信商家转账到零钱接口
  14. 【谷粒学院项目开发44】课程大纲——小节的添删
  15. CreateJS 学习4 动画、TweenJS
  16. SVN提交报错: txn-current-lock拒绝访问。
  17. WPF自学手册-读书笔记(一)
  18. 数据共享交换平台解决方案
  19. 2022秋 | PTA编程训练(二)
  20. Migrating from sun.misc.BASE64 to Java 8 java.util.Base64

热门文章

  1. 亚马逊选品技巧,选品选得好,爆款天天有
  2. appium---切换webview时报错
  3. 罗马数字转换成整型数字
  4. golang 源码剖析(8): 析构SetFinalizer
  5. Android11进行下拉快捷功能qs的增加
  6. C语言 贪吃蛇 命令行
  7. PCB对信号速率的影响
  8. 月薪5万,全靠这款高质量Web前端开发框架!
  9. MySQL数据库备份【2】
  10. linux下挂载硬盘 合并到系统盘 综合