【算法总结】是自己在日常工作中使用过的算法归纳和总结。有部分算法有明显的局限性,但是在特定条件下可以适用。不论如何,全都放在这里,以便记录查找,并请同行指正。
1、判断平面里一点是否在多边形的内部
步骤:
对于多边形的顺序端点序列{P_0, P_1, P_2, ..., P_n},平面内一点Q。
求有向角度 a_i =\angle{ P_{i}QP_{i+1} },以逆时针为正,其中 i = 0, 1, ... (n-1)
如果 \sum{ a_i } 得到 2\pi ,即Q在多边形内。
如果得到0,证明Q在多边形外
优点:在非奇异的凹多边形也适用。
exception:
1、多边形形状十分扭曲
2、Q接近多边形的边,可能引起截断误差
2、圆形与线段求交
问题描述:
已知平面内圆形圆心为 \mathbf{C},半径为r。
另有一线段,起点为\mathbf{P},单位方向为\mathbf{V}。
线段上的点可以表达为\mathbf{P} + t\mathbf{V},其中t \in [0,t_{max}]。
求线段是否与圆形相交,如是,求交点。
解法一:
设圆心\mathbf{C}在线段上的投影为\mathbf{Q},
有\mathbf{Q} = \mathbf{P} + t\mathbf{V}。
另记矢量 \mathbf{M} = \mathbf{P} - \mathbf{C}。
先考虑相切情况,必有矢量\vec{\mathbf{CQ}}的长度为r,即
( \mathbf{M} + t\mathbf{V})^2 = r^2
展开得变量t的二次等式
t^2 + 2t(\mathbf{M} \cdot \mathbf{V}) + \mathbf{M}^2 = r^2
化简为标准型
t^2 + 2bt + c = 0
其中 b = \mathbf{M} \cdot \mathbf{V},而c = \mathbf{M}^2 - r^2
方程的两解为 t = - b \pm \sqrt{b^2 - c}
先计算特征式 \Delta = b^2 - c的情况。
如果\Delta < 0,无实根,不相交。
\Delta = 0,有单实根。\Delta > 0,有双实根。
对于后两种情况,还要把实根t求出,判断是否在线段范围[0,t_{max}]内。
示意图
注意点:线段矢量要预先单位化
优点:可以直接推广至三维或更高维球。
exception:
参考文献:Ericson C. Real-time collision detection[M]. Taylor & Francis US, 2005.
【版权声明:
1、本人对本博客内所有原创文章享有版权,转载请注明作者本人,并以链接形式注明出处。
2、侵犯本人版权相关利益者,个人会在新浪微博、CSDN博客中永久追踪及谴责。同时,保留追究法律责任的权利。向您的厚道致谢。
gwf
初稿 2013.9.20】