我目前正在实施一种视线算法,该算法会告诉我可以和不能在一条线上看到的点。所以,如果我站在一些丘陵地形上,我可以知道我能在哪里看到。
从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
答案 0 :(得分:2)
atan2(start_zelev, p.m_z_elev)
毫无意义。你需要
atan2(distance, p.m_z_elev - start_zelev);
其中distance
是p
和initialPoint
之间的水平距离。
答案 1 :(得分:1)
我发现几个问题:你没有按照FullName = grp.Min(item => item.workerRow.FullNameWithCode),
升序的距离对点进行排序,只使用高程。还为每个地图位置使用goniometrics,这可能很慢。我会用不同的方法代替:
A
编写DDA线插值
LOS=false
其中P(t)=A+(B-A).t
是您的查看方向,(B-A)
是逐步递增的参数,小于您的网格大小(因此您不会遗漏任何内容)。这样就可以让t
没有任何慢的测角计。
然后在地图上找到该对象。如果是拓扑排序,那么这可以是long,lat
或O(1)
测试每个实际位置O(log(n).log(m))
可见度。如果P(t)
设置true
并循环#2 ,则停止整个事情。
btw 这有时称为ray-casting。