【算法总结】工作中使用过的计算几何算法


【算法总结】是自己在日常工作中使用过的算法归纳和总结。有部分算法有明显的局限性,但是在特定条件下可以适用。不论如何,全都放在这里,以便记录查找,并请同行指正。

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】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值