首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在libgdx中矩形与圆扇区的相交

在libgdx中矩形与圆扇区的相交
EN

Stack Overflow用户
提问于 2014-01-15 08:53:19
回答 1查看 1.3K关注 0票数 1

我正在用libgdx编程一个游戏。对于敌人,我想写一个简单的人工智能。这个AI应该跟踪球员,如果他是在视野领域一次。视野是一个圆扇形或2d锥。达到这个目标最有效的方法是什么?我已经阅读了以下内容:点圆扇区

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-15 10:13:31

你可以使用链接后描述的解,但是你必须通过计算dir +/- angle/2的正弦和余弦将你的角度转换成矢量。链接解决方案讨论整数算法,但您的向量将浮动:

代码语言:javascript
复制
arm1 = [cos(d - 0.5 * a), sin(d - 0.5 * a)]
arm2 = [cos(d + 0.5 * a), sin(d + 0.5 * a)]

cossin的论点都是弧度的。在传统的笛卡儿系统中,在x方向,即东方的零点的角度。

为了不做不必要的工作,你应该先检查容易的事情。

在检查与扇区是否相交之前,我会做一个简单的复选框:如果矩形的所有四个角点都在敌人周围的方框之外,则没有交叉口:

代码语言:javascript
复制
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。

直到现在,我们才需要用三角函数来计算向量。你可以用上面给出的公式做这件事。如果你已经有了敌人和角度的正弦和余弦,你可以使用加法定理来加速矢量计算:

代码语言:javascript
复制
# 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的数组中。然后,计算正弦就变成了查找数组的问题,也就是说,它将是快速的,您可以进行所有的计算。(但要注意包装: 5°- 15°应该是350°,而不是-10°)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21132816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档