三维场景下的通视分析作为GIS
中一种重要的分析功能,可应用于旅游中的风景评价,房地产中视线遮挡判断,以及通讯中的信号覆盖,或军事上的火力覆盖等多方面,具有计算结果直观等优点。而通视分析的类型大致有:一点对整个区域的通视面积计算,两点之间的通视性判断,多点通视面积的交集计算,由被覆盖的可视面积反求待定位置与高度等。本文章着重讲解三维场景下前两种通视分析类型的算法和编码。
一点对整个区域的通视面积计算是在给定观察位置后,首先计算此位置与区域内其他顶点之间是否通视,将主要通过下面介绍的
TracePoint(
…
)
函数来实现,然后依据通视与否给三维场景中的其他顶点赋黑白颜色。具体代码如下:
bool
SinglePointVisibilityAnalysis::
VisibilitySinglePointStart(
double
xaxisnumber,
double
yaxisnumber,
float
zaxisadded)
{
int
x,
y;
double
x_Pos,
y_Pos;
double
dx,
dy;
double
z_Pos,
dz;
m_byRsVisibility =
new
BYTE[
m_iRows *
m_iColumns];
//
准备设置黑白两种颜色来区分可见与不可见区域
m_byGsVisibility =
new
BYTE[
m_iRows *
m_iColumns];
m_byBsVisibility =
new
BYTE[
m_iRows *
m_iColumns];
if(!
m_p3dDEMGrid->
IsInGrid(
xaxisnumber,
yaxisnumber))
//
使用索引的时候注意还原i和j,使用位置的时候注意原点和单位格网长度
{
AfxMessageBox(
"Point not in Grid");
return
false;
//