用c++实现Delaunay三角剖分

上传人:飞*** 文档编号:47860850 上传时间:2018-07-05 格式:PDF 页数:5 大小:5.27KB
返回 下载 相关 举报
用c++实现Delaunay三角剖分_第1页
第1页 / 共5页
用c++实现Delaunay三角剖分_第2页
第2页 / 共5页
用c++实现Delaunay三角剖分_第3页
第3页 / 共5页
用c++实现Delaunay三角剖分_第4页
第4页 / 共5页
用c++实现Delaunay三角剖分_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《用c++实现Delaunay三角剖分》由会员分享,可在线阅读,更多相关《用c++实现Delaunay三角剖分(5页珍藏版)》请在金锄头文库上搜索。

1、Delaunay三角剖分void main(PointLink *ptUpOutline, PointLink *ptDownOutline) /首先分别对上下轮廓线的点集进行三角化,ptUpOutline, ptDownOutline 为对应点集TrianglizationInPlan(ptUpOutline) ; TrianglizationInPlan(ptDownOutline) ; /根据两层三角化的结果进行Delaunay剖分,得到四面体链表GetTetrahedron( UpTriangle , DownTriangle ) ; /后处理用于删除不正确的四面体PostProces

2、s() ; 其中:1函数 TrianglizationInPlan() 用于平面三角化void TrianglizationInPlan( PointLink * Head ) /对不符合 Delaunay剖分的边进行细分bool Over = 1; while( Over ) First = Head ; Second = First-next ; while( Second ) if( !NotIncludeOtherPoint( First-Point , Second-Point , Head ) ) PointLink* Point = new PointLink ; First-n

3、ext = Point ; Point-next = Second ; Over = false ; First = Second ; Second = Second-next ; /对平面进行三角化,保存结果到TriangleLink 的链表Trianglization( Head ) ; 2函数GetTetrahedron()进行 Delaunay剖分得到四面体链表void GetTetrahedron( TriangleLink * First, TriangleLink * Second ) Cur = First ; while( Cur ) Temp1 = Cur-Triangle

4、 ; Center = GetCenter( Temp1 ) ; Cur = ContourUp ; while( Cur ) /初始化 min if( Cur = ContourUp ) min = Center.distance( Cur-Point ) ; Value = min ; Result = Cur-Point ; /找距离最小的点else Value = Center.distance( Cur-Point ) ; if( min Value ) min = Value ; Result = Cur-Point ; Cur = Cur-next ; TetrahedronLi

5、nk *T1 = new TetrahedronLink ; T1-volume.Point0 = Cur-Triangle.Point0 ; T1-volume.Point1 = Cur-Triangle.Point1 ; T1-volume.Point2 = Cur-Triangle.Point2 ; T1-volume.Point3 = Result ; T1-type = 1 ; ResultCur-next = T1 ; T1-next = 0 ; ResultCur = T1 ; Cur = Cur-next ; Cur = Second ; while( Cur ) Temp1

6、= Cur-Triangle ; Center = GetCenter( Temp1 ) ; /逐个比较找到离圆心最近的点Cur = ContourDown ; while( Cur ) /初始化 min if( Cur = ContourDown ) min = Center.distance( Cur-Point ) ; Value = min ; Result = Cur-Point ; else /找距离最小的点 Value = Center.distance( Cur-Point ) ; if( min Value ) min = Value ; Result = Cur-Point

7、 ; Cur = Cur-next ; TetrahedronLink *T2 = new TetrahedronLink ; T2-volume.Point0 = Cur-Triangle.Point0 ; T2-volume.Point1 = Cur-Triangle.Point1 ; T2-volume.Point2 = Cur-Triangle.Point2 ; T2-volume.Point3 = Result ; T2-type = 2 ; ResultCur-next = T2 ; T2-next = 0 ; ResultCur = T2 ; Cur = Cur-next ; E

8、dgeCur1 = EdgeUp ; EdgeCur2 = EdgeDown ; Edge tempEdge1 , tempEdge2 ; while( EdgeCur1 ) tempEdge1 = EdgeCur1-line ; while( EdgeCur2 ) tempEdge2 = EdgeCur2-line ; /判断两条边投影是否相交if( EdgesIntersect( tempEdge1 , tempEdge2 ) ) TetrahedronLink *T12 = new TetrahedronLink ; T12-volume.Point0 = tempEdge1.Start

9、 ; T12-volume.Point1 = tempEdge1.End ; T12-volume.Point2 = tempEdge2.Start ; T12-volume.Point3 = tempEdge2.End ; T12-type = 12 ; ResultCur-next = T12 ; T12-next = 0 ; ResultCur = T12 ; EdgeCur2 = EdgeCur2-next ; EdgeCur1 = EdgeCur1-next ; 3函数 EdgesIntersect()两条边投影相交的判断bool EdgesIntersect(Edge edge1,

10、 Edge edge2) C3DPoint Vector , Vector1 , Vector2 ; C3DPoint Middle = edge1.End + edge1.Start ; Middle.x /= 2 ; Middle.y /= 2 ; Middle.z = edge2.Start.z ; Vector = edge1.End - edge1.Start ; Vector1 = edge2.Start - Middle ; Vector2 = edge2.End - Middle ; if( ( Vector*Vector1 = 0 Temp.Point1 = Cur-volu

11、me.Point1 ; Temp.Point2 = Cur-volume.Point2 ; /根据向量间的叉乘,判断是否在轮廓线外if( IsOutSide( ContourUp , Temp ) ) if( Cur = Head ) p = Head ; Head = Cur-next ; delete p ; else p = Cur ; Pre-next = Cur-next ; delete p ; break; case 2:Temp.Point0 = Cur-volume.Point0 ; Temp.Point1 = Cur-volume.Point1 ; Temp.Point2 = Cur-volume.Point2 ; if( IsOutSide( ContourDown , Temp ) ) if( Cur = Head ) p = Head ; Head = Cur-next ; delete p ; else p = Cur ; Pre-next = Cur-next ; delete p ; break; default: break; Pre = Cur ; Cur = Cur-next ;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号