由不规则离散点集生成TIN与GRID-DEM_第1页
由不规则离散点集生成TIN与GRID-DEM_第2页
由不规则离散点集生成TIN与GRID-DEM_第3页
由不规则离散点集生成TIN与GRID-DEM_第4页
由不规则离散点集生成TIN与GRID-DEM_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

由不规则离散点集生成TIN与GRIDDEM

现阶段生成数字高程模型(DEM)的方法较多,如以摄影测量得到的像对为数据源跟踪生成等高线及DEM,由机载激光测距仪记录规则点集后生产数据,也可采用传统的地形图扫描后跟踪等高线,记录一连串离散点集,接着运用各类算法进行处理,最后生成不规则三角网(TIN)与规则格网(GRID)DEM的方法。本文主要介绍的就是以等高线(参考图一)和离散点集为数据源,产生TIN与GRIDDEM的技术路线。具体步骤如下:1)跟踪等高线生成离散点集,记录在文本文件中。参考图二和图三。2)读取文本文件中的数据,进行预处理。主要工作是找到XY轴方向上最小最大数值,压缩数据范围,避免数据范围跨度太大或太小,即出现数据分布稠密或稀疏的情况。

while(!_demfile.eof())

{

_demfile>>point3dXYZ[i][0]>>point3dXYZ[i][1]>>point3dXYZ[i][2];

point3dXYZ[i][2]=point3dXYZ[i][2]/2;

//因为XY轴在随后调整,因此相应调Z轴数值

if(xMin>point3dXYZ[i][0])xMin=point3dXYZ[i][0];//得到整个范围的最大与最小数值

if(xMax<point3dXYZ[i][0])xMax=point3dXYZ[i][0];

if(yMin>point3dXYZ[i][1])yMin=point3dXYZ[i][1];

if(yMax<point3dXYZ[i][1])yMax=point3dXYZ[i][1];

if(zMin>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数值

double

Get_Y(void)

{return(m_Point[1]);

}

//点上的Y数值

double

Get_Z(void)

{return(m_Point[2]);

}

int

Get_Neighbor_Count

(void){

return(m_nNeighbors);

}

//邻接点的个数

TIN_Point*Get_Neighbor

(intiNeighbor)

{

return(iNeighbor>=0&&iNeighbor<m_nNeighbors?m_Neighbors[iNeighbor]:NULL);

}

//得到某一邻接点

int

Get_Triangle_Count

(void){return(m_nTriangles);}

//得到邻接三角形个数

TIN_Triangle*

Get_Triangle(intiTriangle)

{

return(iTriangle>=0&&iTriangle<m_nTriangles?m_Triangles[iTriangle]:NULL);

}private:

TIN_Point(void);

//构造函数

TIN_Point(intID,POINT3dpptxyz);

virtual~TIN_Point(void);

int

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);

//增加顶点

bool

_Add_Triangle

(TIN_Triangle*pTriangle);

//增加三角形

bool

_Del_Relations

(void);};classAFX_EXT_CLASSTIN_Edge

//TIN中的边{

friendclassTIN;

//申明友元类public:

//得到边的端点

TIN_Point*

Get_Point

(intiPoint){

return(m_Points[iPoint%2]);

}private:

}

x1

=Points[Triangles[j].p1]->m_Point[0];//三角形的三个顶点

y1

=Points[Triangles[j].p1]->m_Point[1];

x2

=Points[Triangles[j].p2]->m_Point[0];

y2

=Points[Triangles[j].p2]->m_Point[1];

x3

=Points[Triangles[j].p3]->m_Point[0];

y3

=Points[Triangles[j].p3]->m_Point[1];

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)

//增加新的内存分配

{

status

=3;

if(edges)

free(edges);

if(complete)

free(complete);

}

}

edges[nedge+0].p1

=Triangles[j].p1;

//存储边的信息

edges[nedge+0].p2

=Triangles[j].p2;

//顶点的索引:1,2;2,3;3,1

edges[nedge+1].p1

=Triangles[j].p2;

edges[nedge+1].p2

=Triangles[j].p3;

edges[nedge+2].p1

=Triangles[j].p3;

edges[nedge+2].p2

=Triangles[j].p1;

nedge

+=3;

//对于最外层循环的顶点来说,相关边的个数加上3

Triangles[j]=Triangles[nTriangles-1];

/将链表中最后一个三角形赋值过来

complete[j]=complete[nTriangles-1];

nTriangles--;

//三角形个数减去

j--;

}

//对应:if(inside)

}

//结束对所有三角形的循环

//标记被重复使用的边

//若三角形以逆时针方向存储,则内部被多次使用的边存储的顶点顺序是相反的

for(j=0;j<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))

//同样的一条边

{

edges[j].p1=-1;

edges[j].p2=-1;

edges[k].p1=-1;

edges[k].p2=-1;

}

}

}

//组成新三角形

//忽略所有已经打过标志的边

//所有的边以顺时针方向安排

for(j=0;j<nedge;j++)

{

if(edges[j].p1<0||edges[j].p2<0)

//比如等于-1的情况

{

continue;

}

if(nTriangles>=trimax)

{

status

=4;

if(edges)

free(edges);

if(complete)

free(complete);

}

Triangles[nTriangles].p1

=edges[j].p1;

//记录关联的边的一个顶点索引

Triangles[nTriangles].p2

=edges[j].p2;//记记录关联的边的另一个顶点索引

Triangles[nTriangles].p3

=i;//对于最外层循环的顶点来说,记录此顶点的索引

complete[nTriangles]

=false;

nTriangles++;

}

}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论