圆与扇形的碰撞检测,以前用过一种算法是这样的:
首先把扇形视作一个圆,排除圆与扇形圆不相交的情况,
然后如果圆心在扇形两条边中间,则必然相交,
剩下的就判断圆是否与两条边相交。
这种算法用到了点与直线的关系,圆与线段的碰撞检测,圆与圆的碰撞检测等,算法清晰,实现起来比较简单,但只能适用于扇形夹角小于180度的情况。
今天偶尔想到了一种新的算法:
首先把扇形视作一个圆,排除圆与扇形圆不相交的情况,然后根据向量夹角判断圆与扇形是否相交。
设向量p1p2为v1, 向量p1p为v2,向量v2从v1方向绕p1点旋转,当转到超过最大角度时,圆与扇形不再相交,所以只要求出该最大角度即可。
作图可知,当圆与扇形边相切时为最大角度,设向量v1与扇形边的夹角为theta,则 theta = asinf(r / len), 最大角度为 theta + radian * 0.5f.
计算出向量v1, v2的夹角,如果 <= 最大角度,则圆与扇形相交。
这个算法理论上要比前一种算法好,并且扇形夹角可以支持0到360度。
圆与扇形碰撞检测实现代码如下:
偶然间想到的一种算法,网上并没有找到相关文章,代码可能会有bug,如有发现会第一时间修正。
圆与扇形碰撞检测
时间: 2024-11-09 03:00:59