在Rectg和libgdx中的Circle扇区之间的交点

时间:2014-01-15 08:53:19

标签: java algorithm libgdx intersection

我正在使用libgdx编写游戏。对于敌人我想写一个简单的AI。这个AI应该跟踪玩家,如果他曾经在Vision领域一次。视野是圆扇形或2d圆锥。达到这个目标的最有效方法是什么?我已经阅读了以下内容: Point in circle sector

我可以在我的玩家的每个角点使用它,但我也有方向和角度给出的视野(direction - angle/2direction + angle/2之间的扇区)。 角度不会超过180(因为这对算法来说是个问题)。为游戏中的每个敌人计算扇区开始和结束的向量是否有问题?什么是最好的解决方案,我如何计算出给定方向和角度的矢量?

1 个答案:

答案 0 :(得分:2)

您可以使用链接帖子中描述的解决方案,但您必须通过计算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)]

cossin的参数以弧度为单位。 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。

现在我们必须用trig函数计算向量。您可以使用上面给出的公式执行此操作。如果你已经拥有了敌人和角度的正弦和余弦,你可以使用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_dsin_d

如果你不关心准确度并且不想进入弧度,你可以预先计算正弦和余弦的一度,并将它们存储在两个360度的数组中。然后计算正弦将成为一个问题查找数组,即它会很快,你可以在n度进行所有计算。 (但要注意包装:5° - 15°应该是350°,而不是-10°。)