如何测试三角形和正方形是否相交?
如果我们知道它是正方形而不是矩形,有什么优化的方法吗?此外,正方形是轴对齐的,这应该可以提高性能?
还是应该将正方形分成三角形,并两次进行三角形相交检查?
编辑:澄清一下:我试图检查这两个形状是否以任何方式重叠。因此,三角形可以在正方形内部,正方形也可以在三角形内部,它应该返回true。
如何测试三角形和正方形是否相交?
如果我们知道它是正方形而不是矩形,有什么优化的方法吗?此外,正方形是轴对齐的,这应该可以提高性能?
还是应该将正方形分成三角形,并两次进行三角形相交检查?
编辑:澄清一下:我试图检查这两个形状是否以任何方式重叠。因此,三角形可以在正方形内部,正方形也可以在三角形内部,它应该返回true。
计算形状的外接圆。如果两个形状中心点之间的距离大于外接圆半径之和,则可以排除碰撞。请注意,外接矩形的中心点是其对角线的中点。通过找到任意两条边的垂直平分线的交点,可以得到三角形的外接圆的中心点。两种找到一个悲观估计圆形的方法,以完全包含一个三角形:(1)使用最长的边作为圆的直径,(2)创建一个边界矩形,其角落位于(mintx, minty), (mintx, maxty), (maxtx, maxty)和(maxtx, minty),其中maxtx是任何三角形角落的最大X坐标,mintx是任何三角形角落的最小X坐标等。
可以将形状平移和旋转,使矩形的一个顶点位于原点,并且矩形的底边沿着正X轴。这使得查找三角形中是否包含一个顶点在矩形内变得简单。
平移、旋转和线段相交是非常了解的问题,您应该没有问题找到适合的代码在stackoverflow上,或者其他地方在网络上。
提示:
概念上,旋转很容易 - 对于每个点,将其转换为极坐标,加或减旋转角度,然后再转换回笛卡尔坐标。由于转换为/从极坐标的计算成本很高,因此可以使用以下公式进行旋转:
Xrot = X * cos(theta) - Y * sin(theta)
Yrot = X * sin(theta) + Y * cos(theta)
您可以通过取矩形的一条边来找到角度theta,并注意到
theta = atan2(deltaX, deltaY)