您可以使用链接帖子中描述的解决方案,但您必须通过计算 dir +/- angle/2 的正弦和余弦将角度转换为矢量。链接的解决方案讨论整数算术,但您的向量将是浮点数:
arm1 = [cos(d - 0.5 * a), sin(d - 0.5 * a)]
arm2 = [cos(d + 0.5 * a), sin(d + 0.5 * a)]
cos 和 sin 的参数以弧度表示。 x 方向的零点角度,即传统笛卡尔坐标系中的东。
为了不做不必要的工作,你应该先检查容易的事情。
在检查与扇区的交点之前,我会做一个简单的方框检查:如果矩形的所有四个角点都在敌人周围的方框之外,则没有交点:
if (x0 < x-r && x1 < x-r && x2 < x-r && x3 < x-r) return false;
if (x0 > x+r && x1 > x+r && x2 > x+r && x3 > x+r) return false;
if (y0 < y-r && y1 < y-r && y2 < y-r && y3 < y-r) return false;
if (y0 > y+r && y1 > y+r && y2 > y+r && y3 > y+r) return false;
这个简单的检查应该可以排除很多敌人。
接下来,检查链接答案中描述的所有四个点的半径,如果您的角点都不在半径内,则返回 false。
只是现在我们必须用三角函数计算向量。您可以使用上面给出的公式来做到这一点。如果你已经有了敌人和角度的正余弦,你可以使用addition theoremes加速向量计算:
# sin_d = sin(d), cos_d = cos(d)
# sin_a = sin(0.5 * a), cos_a = cos(0.5 * a)
arm1 = [cos_d * cos_a + sin_d * sin_a, sin_d * cos_a - cos_d * sin_a]
arm2 = [cos_d * cos_a - sin_d * sin_a, sin_d * cos_a + cos_d * sin_a]
每个敌人的视角可能是一个常数,因此您可以预先计算它,并且您可能已经预先计算了 cos_d 和 sin_d。
如果您不关心准确性并且不想进入弧度,您可以预先计算 1 度步长的正弦和余弦并将它们存储在大小为 360 的两个数组中。然后计算正弦将成为问题查找数组,即它会很快,并且您可以进行所有计算 n 度。 (但要注意包裹:5° - 15° 应该是 350°,而不是 -10°。)