algorithm - 如何计算某物是否在某人的视野中

标签 algorithm math vector language-agnostic geometry

我有一个对象,它在二维空间中有一个位置和一个速度,两者都由一个向量表示。受试者的视野为每侧 135 度。它看起来与移动方向相同(速度矢量)。

我的对象在二维空间中的位置由向量表示。

图中蓝色背景的物体是可见的,红色背景的物体是不可见的。

我如何计算在给定时刻哪些物体位于主体的视野中?

Which objects lie in field of vision

最佳答案

你只需要找到到物体的距离和朝向它们的角度。然后,检查距离不大于那个浅蓝色圆圈的半径,并且速度矢量与物体的矢量之间的角度不是太大。

欧氏距离就是sqrt ((x2 - x1)^2 + (y2 - y1)^2) ( link )。

关于角度,表示矢量(x2 - x1, y2 - y1) 和速度(vx, vy)polar coordinate system ,然后检查角度之间的绝对差值是否不超过 135 度。在编程语言中,通常有一个方便的函数 atan2 (y, x) 来求出单个向量的极角 (link)。


点的极角是从向量 Ox 沿逆时针方向测量的。考虑我们有两个点:速度矢量的端点 (vx, vy)(左图)和从我们的对象 (x1, y1) 到对象的矢量的端点有问题的 (x2, y2):它是向量 (x2 - x1, y2 - y1)(中心图片)。假设极角分别为 alphabeta。那么(vx, vy)(x2 - x1, y2 - y1)之间的夹角就是这两个极角的差值(右图)。

Figure 1 Figure 2 Figure 3

但是有一个窍门。您获得的 alphabeta 值通常是从 -PI 到 +PI,或者从 0 到 2PI。因此,beta - alpha 的差值介于 -2PI 和 +2PI 之间,您希望它介于 -PI(从当前方向顺时针旋转 180 度)和 +PI(从当前方向逆时针旋转 180 度)之间方向)。为此,一些简单的转换就足够了,例如这个伪代码:

if angle > +PI:
    angle := angle - 2PI
if angle < -PI:
    angle := angle + 2PI

关于algorithm - 如何计算某物是否在某人的视野中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542821/

相关文章:

algorithm - 在一个方向上与原点相交 minkowski 差异,我如何找到相交的脸?

math - 在哪里可以找到真正的FFT和iFFT实现?

c++ - 如何使用单个 for 循环遍历 std::map<string,int> 和 std::vector<int>?

java - MineSweeper 揭示邻居帮助需要 java

arrays - 将全为零的给定数组转换为目标数组

algorithm - 将正整数分解为更多整数,使得总和与原始整数相同

math - 为什么 erlang 重新定义了像余数这样基本的东西?

c++ - 权重增加的枚举位集。 (C++ & Boost::dynamic_bitset)

arrays - 如何将IoSliceMut数组转换为Vec <u8>?

R:具有不同条件的 For 循环用相同的数据填充 2 个向量