最近我开始对我正在制作的游戏中的SAT(分离轴定理)进行碰撞检测的一些研究。我理解算法的工作原理及其工作原理,我所困惑的是它如何能够如此轻松地计算出不同轴上的形状投影。
我假设多边形在矢量上的投影由从A点到B点的线段表示,所以我最好猜测找到点A和B将是找到投影到的线的角度并计算当形状旋转到投影角度时坐标的最小和最大x值(即,使其平行于x轴,最小值和最大值只是沿x轴的最小值和最大值) )。但是,为每个预测做这件事将是一项昂贵的操作。你们中的任何人都知道更好的解决方案吗,或者至少可以指向一篇描述更好解决方案的论文或文档?
答案 0 :(得分:2)
计算多边形在线上的投影的简单方法是计算所有顶点到线上的投影,并获得像您建议的最小 - 最大值坐标,但您不需要旋转多边形来执行此操作。
以下是查找在线投影的算法: -
line : y = mx + c
point : (x1,y1)
projection is intersection of line perpendicular to given line and passing through (x1,y1)
perdenicular line :- y-y1 = -1/m(x-x1) slope of perpendicular line is -1/m
y = -1/m(x-x1) + y1
To find point of intersection solve the equation simultaneously :-
y = mx + c , y = -1/m(x-x1) + y1
mx + c = -1/m(x-x1) + y1
m^2*x + mc = x1-x + my1
(m^2+1)x = x1 + my1 - mc
x = (x1-my1 - mc)/(m^2+1)
y = mx + c = m(x1-my1-mc)/(m^2+1) + c
时间复杂度:对于每个顶点,它需要O (1)
时间,因此它是O(V)
,其中V
不是多边形中的顶点
答案 1 :(得分:0)
如果多边形不是凸面,则首先计算其凸包。
给定具有n
个顶点的凸多边形,您可以通过二分查找在n log n
中找到其旋转的最小和最大x坐标。您可以通过旋转比较顶点和两个相邻顶点来测试顶点是最小值还是最大值。根据比较结果,您可以知道是顺时针还是逆时针跳跃。跳过k
个顶点,每次将k
减少一半(在开始k=n/2
处)。
这可能会也可能不会带来真正的速度提升。如果典型的多边形有十几个顶点,那么使用二进制搜索可能没什么意义。