3D视线算法

时间:2016-10-05 03:16:43

标签: algorithm c++11

我目前正在实施一种视线算法,该算法会告诉我可以和不能在一条线上看到的点。所以,如果我站在一些丘陵地形上,我可以知道我能在哪里看到。

从A点到B点生成的线包括A和B之间均匀分布的多个点。从A开始,我看到A和B之间的仰角是什么。我注意到我的{{ 1}}。

接下来,对于A和B之间的每个点,我得到A和该点之间的仰角。如果该点是目前为止的最高仰角(不包括alphaAngle),那么我将其标记为这样。否则,它具有较低的仰角,因此我无法看到它,并将该点标记为alphaAngle

以下是我使用的一些对象定义:

hasLOS = false

这是我的算法写出来的,但它没有返回正确的结果。要么它不应该声称它有LOS(就像从一座山后面走到另一座山的另一边,我不应该看到它)。 或者它声称我不能看到我应该看到的终点(山顶到山谷下面)。所以,我怀疑我找到视线的实现是不正确的,或者我在代码中实现错误。

struct TerrainProfilPnt
{
 double m_x_lon; //lon
 double m_y_lat; //lat
 double m_z_elev; //elev
 bool m_hasLOS; //Does this point have line of sight from another point?
};

class TerrainProfilePartitioner; // Holds a collection of points that make up the line

2 个答案:

答案 0 :(得分:2)

atan2(start_zelev, p.m_z_elev)毫无意义。你需要

    atan2(distance, p.m_z_elev - start_zelev);

其中distancepinitialPoint之间的水平距离。

答案 1 :(得分:1)

我发现几个问题:你没有按照FullName = grp.Min(item => item.workerRow.FullNameWithCode), 升序的距离对点进行排序,只使用高程。还为每个地图位置使用goniometrics,这可能很慢。我会用不同的方法代替:

  1. 为整个地图设置A
  2. 编写DDA线插值

    LOS=false

    其中P(t)=A+(B-A).t 是您的查看方向,(B-A)是逐步递增的参数,小于您的网格大小(因此您不会遗漏任何内容)。这样就可以让t没有任何慢的测角计。

    然后在地图上找到该对象。如果是拓扑排序,那么这可以是long,latO(1)

  3. 测试每个实际位置O(log(n).log(m))

    可见度。如果P(t)设置true并循环#2 ,则停止整个事情。

  4. btw 这有时称为ray-casting