1、由不规则离散点集生成TIN与GRIDDEM由不规则离散点集生成GRID-DEMTIN与由不规则离散点集生成 TIN与GRID DEM现阶段生成数字高程模型(DEM )的方法较多,如以摄影测量得到的像对为数据源跟踪生成等高线及 DEM,由机载激光测距仪记录规则点集后生产数据,也可采用传统的地形图扫描后跟踪等高线,记录一连串离散点集,接着运用各类算法进行处理,最后生成不规则三角网(TIN )与规则格网(GRID)DEM的方法。本文主要介绍的就是以等高线(参考图一)和离散点集为数据源,产生 TIN与GRID DEM 的技术路线。具体步骤如下:1)跟踪等高线生成离散点集,记录在文本文件中。参考图二和图
2、三。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(xMinpoint3dXYZ i 0)xMin = point3dXYZ i0; /得到整个范围的最大与最小数值if(xMaxpoint3dXYZ i1)
3、yMin = point3dXYZ i1;if(yMaxpoint3dXYZ i 2)zMin = point3dXYZ i2;if(zMaxpoint3dXYZ i 2)zMax = point3dXYZ i2;i+;_demfile . close (); /文件流读取完毕,关闭_demfile . clear (); / 文件流清除3)完成TIN中点,线,三角形和网的定义。Class AFX_EXT_CLASSTIN_Poi nt /TIN中的点friend class TIN;public :int Get_ID ( void ) return ( m_ID ); /ID 数值cons
4、t POINT3d&Get Point(void ) return ( m_Point );/普通的点doubleGet_X( void )returnm_Point0);/点上的X数值doubleGet_Y( void )returnm_Point1);/点上的丫数值doubleGet_Z( void )returnm_Point2);intGet_Neighbor_Count(void ) return ( m_nNeighbors );/邻接点的个数TIN Point* Get_Neighbor(intiNeighbor = 0 &intGet_Triangle_Count(void )
5、 returnTIN_Triangle *Get_Triangle ( int iTriangle )m_nTriangles ? m_TrianglesiTriangle : NULL); private :TIN_Point ( void );TIN_Point ( int ID,POINT3d pptxyz );m_nTriangles );/得到邻接三角形个数return ( iTriangle = 0 & iTriangle m_Extent. Get_YRange() ? m_Extent. Get_XRange():m_Extent. Get_YRange();/取范围中XY两轴
6、的较大数值xmid =m_Extent. Get_XCenter();/中心占八、ymid =m_Extent. Get_YCenter();PointsnPoints+ 0-m_Poi nt0xmid - 20 * dmax 第一个顶点的 X数值PointsnPoints+ 0-m_Poi nt1ymid - dmax;/第一个顶点的 Y数值,此数值取得相当小PointsnPoints+ 1-m_Point0xmid;/第二个顶点的X数值PointsnPoints+ 1-m_Poi nt1=ymid + 20 * dmax / 第二个顶点的Y数值,居中,但偏高PointsnPoints+ 2
7、-m_Poi nt0xmid + 20 * dmax /第三个顶点的X数值PointsnPoints+ 2-m_Poi nt 1ymid - dmax 第三个顶点的 Y数值,第三个顶点与第一个顶点高度相同,在X轴上对称Triangles 0. p1 = nPoints+ 0;/三角形的顶点记录的是顶点数组中的索引+ 1;Triangles 0. p2 = nPoints+ 2;Triangles 0. p3 = nPointscomplete 0= false ;nTriangles=1;/初始化三角形个数为 1/每次增加一个顶点到已存在的TIN格网中for (i =0; i m_Point0
8、;/使用浮点数进行记录yp = Points i -m_Point1;/使用浮点数进行记录n edge始化边的个数为0=0;/对于每个顶点,初/如果顶点位于三角形的外接圆内,则原三角形的三条边被加到一个缓存中,并移走此三角形/对于所有刚刚建立的三for (j =0; j vnTriangles ; j +)角形进行循环if ( complete j )continue/此三角形的完整性不用破坏,继续下次循环判断顶点与外接圆的关系xp )此三角形为完整性if ( xc + r m_Point0; /三角形的三个顶点y1= Points Trianglesj.p1-m_Point1;x2= Poi
9、nts Trianglesj.p2-m_Point0;y2= Points Trianglesj.p2-m_Point1;x3= Points Trianglesj.p3-m_Point0;y3= Points Trianglesj.p3-m_Point1;inside= _CircumCircle (xp, yp,x1,y1, x2, y2, x3, y3, &xc, &yc, &); /if ( in side )/顶点落在外接圆里面/检查是否超岀边链表的大小 if ( nedge + 3 = emax )emax+=100;sizeof (TTIN_Edge) = NULL)/增加边的个
10、数if ( ( edges = ( TTIN_Edge *) realloc (edges, emax*/增加新的内存分配存储边的信息引:1,2; 2,3; 3,1edges nedge + 0. p1edges nedge + 0. p2edges nedge + 1. p1edges nedge + 1. p2status = 3;if ( edges )if ( complete )=Triangles j . p1;=Triangles j . p2;=Triangles j . p2;=Triangles j . p3;free (edges);free (complete );/顶
11、点的索edgesnedge + 2. pl = Triangles j . P3;edges nedge + 2. p2 = Triangles j . pi;个数加上来形的循环edges k.-1;edges k.nedge += 3; /对于最外层循环的顶点来说,相关边的3Triangles j = Triangles nTriangles - 1; /将链表中最后一个二角形赋值过complete j = complete nTriangles - 1;nTriangles -;/三角形个数减去j -;/ 对应:if( inside ) /结束对所有三角/标记被重复使用的边/若三角形以逆时
12、针方向存储,则内部被多次使用的边存储的顶点顺序是相反的for (j =0; j nedge-1; j +)for (k=j +1; knedge; k+)if ( ( edgesj . p1 = edges k. p2) & ( edges j . p2 =p1) ) /同样的一条边存储的方向刚刚相反edgesj. p1 =/做标记edgesj. p2 = -1;edges k. p1 = -1;edges k. p2 = -1;if ( ( edgesj . p1 = edges k. p1) & ( edges j . p2 =p2) ) /同样的一条边edgesj. p1 = -1;ed
13、ges j . p2 = -1;edges k. p1 = -1;edges k. p2 = -1;/组成新三角形/忽略所有已经打过标志的边/所有的边以顺时针方向安排for(j=0; jvnedge; j +)if ( edges j . pl 0 | edges j . p2 = trimaxstatus = 4;if ( edges ) if ( complete )Triangles nTriangles . p1引Triangles nTriangles . p2Triangles nTriangles . p3索引complete nTriangles nTriangles +;fo
14、r(i=0;i;i+)free (edges);free (complete );=edgesj . p1; /记录关联的边的一个顶点索=edges j . p2; /记记录关联的边的另一个顶点索引=i;/对于最外层循环的顶点来说,记录此顶点的=false ;/对所有的顶点循环完毕 /对应着/ /移走初始定义的大外接三角形/这些三角/ Remove triangles with supertrianglevertices/ These are triangles which have a vertex number greater than nPoints形的顶点索引超岀了顶点个数for (i
15、 =0; i = nPoints| Triangles i . p2 = nPoints| Triangles i . p3 = nPoints )Triangles i = Triangles nTriangles - 1; / 不断的把最后一个三角形赋值过来nTriangles -;i -;return ( status = 0 );5 )对TIN中的三角形进行循环,以每个三角形的顶点为参数,插值生成 GRID DEM 。参见图四.图一:等高线图洒因 500 576QC 57BQWJI I i I IIII *| k;、=- 11, i _tw 广 J 二二7厂二Y/iJii 、_ 厂厂J
16、d.、i/Jf f F TLfd -J上三二7TIrq:GSiJ?AJ/ :广ICO: 2000 3COO 4000 MOH 6050 7000 RO32- MOO 10:00 11000 1?00fl U00C- 1OlO 1S-300 17COO 1B00C图二:离散点57E(JC10fl: 2OCD 3?0O JOOO 500? SCIO 7D0:创畀 MCO 10:00 MOO, IPOOC 13-SiO *SOOO 1G3M t7C?0 9 XKblCOH 馬gn RB 5. DiK 良 3 曲.QHIM NCE- 003:1口冃二丿|口_!|_.|口=呂名呂2 34 g 邛HI总
17、COZ 8M G , i IHMi I li l t ! z J If i图三:导出的数据存储在文本中QfJ.; Z J-i 毋社 f h UU VUUUS75870.000000 575951-335765 575750.000000 575730,0eiS 575763.92536E E757S5.000300 -?5345445 57573pQ00300 575SSS哎 575950 QQgg 5760032哙3吐二工 576016,3勺呂 57597 厉 52 五石;3 5fi2OlOOOO0OO 562032.72230 562010.000000 562001.65826 5620
18、10-000000 562010.000000 577760.000000 577850.000000 577949.000000 577753.000000 577724.Q-71B67 577670 .ODOODCi 577S80.00000051312.120915571324.SS8257 5717345.27603 571414.358:5 571-7SC4 .A8S2S7 5717321.179-389.555*5-57173书呂220 571734 电电225丁 571775.巧召甫E81 5717774右W3257 571734廿巧已257 571754.8825 571824
19、 2239自2 571S74.335x57 57113.23731 571074為E325T 571824.228952 57134.23952 571552.209445 571811唱疔23五石 571515.507705 57K852.209445 571SS74.88257 5713S 3吗13295716909.04165图四:生成的GRID DEM囚七.茫审冋翌X I,昭g 总妃昌DEMg47.00000047.00000047.00000037.0000007.00000047.000000 ma越g7.000090 i7.00Q090 EQQQ00Q 攻7 000000 17.000090 7.DQOOQO 吕000000 48.000000 今E 000000 处.000000 8.000000 4? .000000 50,000000 50 0QOODO 50.000000 51.000000 51,000000 5100000051.000000
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1