由不规则离散点集生成TIN与GRID DEMWord格式.docx
- 文档编号:17098407
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:12
- 大小:260.40KB
由不规则离散点集生成TIN与GRID DEMWord格式.docx
《由不规则离散点集生成TIN与GRID DEMWord格式.docx》由会员分享,可在线阅读,更多相关《由不规则离散点集生成TIN与GRID DEMWord格式.docx(12页珍藏版)》请在冰豆网上搜索。
point3dXYZ[i][2])zMin=point3dXYZ[i][2];
if(zMax<
point3dXYZ[i][2])zMax=point3dXYZ[i][2];
i++;
}
_demfile.close();
//文件流读取完毕,关闭
_demfile.clear();
//文件流清除
3)完成TIN中点,线,三角形和网的定义。
classAFX_EXT_CLASSTIN_Point
{
//TIN中的点
friendclassTIN;
public:
int
Get_ID
(void)
{
return(m_ID);
}
//ID数值
constPOINT3d&
Get_Point
(void){
return(m_Point);
}
//普通的点
double
Get_X(void)
{return(m_Point[0]);
//点上的X数值
Get_Y(void)
{return(m_Point[1]);
//点上的Y数值
Get_Z(void)
{return(m_Point[2]);
int
Get_Neighbor_Count
return(m_nNeighbors);
//邻接点的个数
TIN_Point*Get_Neighbor
(intiNeighbor)
return(iNeighbor>
=0&
&
iNeighbor<
m_nNeighbors?
m_Neighbors[iNeighbor]:
NULL);
//得到某一邻接点
Get_Triangle_Count
(void){return(m_nTriangles);
//得到邻接三角形个数
TIN_Triangle*
Get_Triangle(intiTriangle)
return(iTriangle>
iTriangle<
m_nTriangles?
m_Triangles[iTriangle]:
}
private:
TIN_Point(void);
//构造函数
TIN_Point(intID,POINT3dpptxyz);
virtual~TIN_Point(void);
m_ID,m_nNeighbors,m_nTriangles;
//本身ID数值,邻接点个数,邻接三角形个数
POINT3d
m_Point;
//自身存储着XY数值
TIN_Point
**m_Neighbors;
//邻接顶点
TIN_Triangle
**m_Triangles;
//邻接三角形
bool
_Add_Neighbor
(TIN_Point*pNeighbor);
//增加顶点
_Add_Triangle
(TIN_Triangle*pTriangle);
//增加三角形
_Del_Relations
(void);
};
classAFX_EXT_CLASSTIN_Edge
//TIN中的边
//申明友元类
//得到边的端点
TIN_Point*
Get_Point
(intiPoint){
return(m_Points[iPoint%2]);
TIN_Edge(TIN_Point*a,TIN_Point*b);
virtual~TIN_Edge(void);
*m_Points[2];
//边的两个端点
4)以找到预处理后离散点集的最大外包三角形作为队列中第一个三角形开始,依次加入点集中的每个顶点,接着判断此新加顶点与已经存在的每个三角形的外接圆是否存在包含关系,如果包含,则改变此关联三角形的边信息后,然后以新加入的顶点和关联三角形的顶点为参数创建新的三角形,最后收尾工作是,以完成的三角化后每个三角形中的顶点为参数,建立TIN中的顶点、边和三角形之间的关系。
boolTIN:
:
_Triangulate(TIN_Point**Points,intnPoints,TTIN_Triangle*Triangles,int&
nTriangles)
{
i,j,k,inside,trimax,
nedge
=0,
emax
=200,
status
*complete
=NULL;
xmid,ymid,dmax,
xp,yp,x1,y1,x2,y2,x3,y3,xc,yc,r;
TTIN_Edge
*edges
//TTIN_Edge:
边的结构
//-----------------------------------------------------
//Allocatememoryforthecompletenesslist,flagforeachtriangle
//
trimax
=4*nPoints;
if((complete
=(int
*)malloc(trimax*sizeof(int)))==NULL)
//给即将生成的三角形的标志分配内存
=1;
if(edges)
free(edges);
//如果不为空,首先释放内存
if(complete)
free(complete);
//Allocatememoryfortheedgelist
if((edges
=(TTIN_Edge*)malloc(emax
*sizeof(TTIN_Edge)))==NULL)
//给边的标志分配内存
=2;
//准备找到最大外包三角形作为三角形队列中第一个三角形,并准备不断的添加新顶点
_Extent_Update();
//更新整个离散顶点的矩形范围
dmax=m_Extent.Get_XRange()>
m_Extent.Get_YRange()?
m_Extent.Get_XRange():
m_Extent.Get_YRange();
//取范围中XY两轴的较大数值
xmid=m_Extent.Get_XCenter();
//中心点
ymid=m_Extent.Get_YCenter();
Points[nPoints+0]->
m_Point[0]
=xmid-20*dmax;
//第一个顶点的X数值
m_Point[1]
=ymid-dmax;
//第一个顶点的Y数值,此数值取得相当小
Points[nPoints+1]->
=xmid;
//第二个顶点的X数值
=ymid+20*dmax;
//第二个顶点的Y数值,居中,但偏高
Points[nPoints+2]->
=xmid+20*dmax;
//第三个顶点的X数值
//第三个顶点的Y数值,第三个顶点与第一个顶点高度相同,在X轴上对称
Triangles[0].p1
=nPoints+0;
//三角形的顶点记录的是顶点数组中的索引
Triangles[0].p2
=nPoints+1;
Triangles[0].p3
=nPoints+2;
complete[0]=false;
nTriangles
//初始化三角形个数为1
//每次增加一个顶点到已存在的TIN格网中
for(i=0;
i<
nPoints;
i++)
//对于所有顶点进行循环
xp
=Points[i]->
m_Point[0];
//使用浮点数进行记录
yp
m_Point[1];
=0;
//对于每个顶点,初始化边的个数为0
//如果顶点位于三角形的外接圆内,则原三角形的三条边被加到一个缓存中,并移走此三角形
for(j=0;
j<
nTriangles;
j++)
//对于所有刚刚建立的三角形进行循环
if(complete[j])
continue;
//此三角形的完整性不用破坏,继续下次循环
x1
=Points[Triangles[j].p1]->
//三角形的三个顶点
y1
x2
=Points[Triangles[j].p2]->
y2
x3
=Points[Triangles[j].p3]->
y3
inside
=_CircumCircle(xp,yp,x1,y1,x2,y2,x3,y3,&
xc,&
yc,&
r);
//判断顶点与外接圆的关系
if(xc+r<
xp)
//顶点落在外接圆之外
complete[j]
=true;
//标记此三角形为完整性
if(inside)
//顶点落在外接圆里面
//检查是否超出边链表的大小
if(nedge+3>
=emax)
emax+=100;
//增加边的个数
if((edges=(TTIN_Edge*)realloc(edges,emax*sizeof(TTIN_Edge)))==NULL)
//增加新的内存分配
=3;
edges[nedge+0].p1
=Triangles[j].p1;
//存储边的信息
edges[nedge+0].p2
=Triangles[j].p2;
//顶点的索引:
1,2;
2,3;
3,1
edges[nedge+1].p1
edges[nedge+1].p2
=Triangles[j].p3;
edges[nedge+2].p1
edges[nedge+2].p2
+=3;
//对于最外层循环的顶点来说,相关边的个数加上3
Triangles[j]=Triangles[nTriangles-1];
/将链表中最后一个三角形赋值过来
complete[j]=complete[nTriangles-1];
nTriangles--;
//三角形个数减去
j--;
//对应:
if(inside)
//结束对所有三角形的循环
//标记被重复使用的边
//若三角形以逆时针方向存储,则内部被多次使用的边存储的顶点顺序是相反的
nedge-1;
j++)
for(k=j+1;
k<
nedge;
k++)
if((edges[j].p1==edges[k].p2)&
(edges[j].p2==edges[k].p1))
//同样的一条边存储的方向刚刚相反
edges[j].p1=-1;
//做标记
edges[j].p2=-1;
edges[k].p1=-1;
edges[k].p2=-1;
if((edges[j].p1==edges[k].p1)&
(edges[j].p2==edges[k].p2))
//同样的一条边
//组成新三角形
//忽略所有已经打过标志的边
//所有的边以顺时针方向安排
if(edges[j].p1<
0||edges[j].p2<
0)
//比如等于-1的情况
if(nTriangles>
=trimax)
=4;
Triangles[nTriangles].p1
=edges[j].p1;
//记录关联的边的一个顶点索引
Triangles[nTriangles].p2
=edges[j].p2;
//记记录关联的边的另一个顶点索引
Triangles[nTriangles].p3
=i;
//对于最外层循环的顶点来说,记录此顶点的索引
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 由不规则离散点集生成TIN与GRID DEM 不规则 离散 生成 TIN GRID