当前位置:文档之家› 用c++实现Delaunay三角剖分

用c++实现Delaunay三角剖分

Delaunay三角剖分 void main(PointLink *ptUpOutline, PointLink *ptDownOutline) { //首先分别对上下轮廓线的点集进行三角化,ptUpOutline, ptDownOutline为对应点集 TrianglizationInPlan(ptUpOutline) ; TrianglizationInPlan(ptDownOutline) ;

//根据两层三角化的结果进行Delaunay剖分,得到四面体链表 GetTetrahedron( UpTriangle , DownTriangle ) ;

//后处理用于删除不正确的四面体 PostProcess() ; }

其中: 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->next = 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 ; 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 ; } TetrahedronLink *T1 = new TetrahedronLink ; T1->volume.Point[0] = Cur->Triangle.Point[0] ; T1->volume.Point[1] = Cur->Triangle.Point[1] ; T1->volume.Point[2] = Cur->Triangle.Point[2] ; T1->volume.Point[3] = Result ; T1->type = 1 ; ResultCur->next = T1 ; T1->next = 0 ; ResultCur = T1 ; Cur = Cur->next ; }

Cur = Second ; while( Cur ){ Temp1 = 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 ; } } Cur = Cur->next ; } TetrahedronLink *T2 = new TetrahedronLink ; T2->volume.Point[0] = Cur->Triangle.Point[0] ; T2->volume.Point[1] = Cur->Triangle.Point[1] ; T2->volume.Point[2] = Cur->Triangle.Point[2] ; T2->volume.Point[3] = Result ; T2->type = 2 ; ResultCur->next = T2 ; T2->next = 0 ; ResultCur = T2 ; Cur = Cur->next ; }

EdgeCur1 = 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.Point[0] = tempEdge1.Start ; T12->volume.Point[1] = tempEdge1.End ; T12->volume.Point[2] = tempEdge2.Start ; T12->volume.Point[3] = 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, 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 && Vector*Vector2 >= 0 ) || ( Vector*Vector1 <= 0 && Vector*Vector2 <= 0 )) return true ; Middle = edge2.End + edge2.Start ; Middle.x /= 2 ; Middle.y /= 2 ; Middle.z = edge1.Start.z ; Vector = edge2.End - edge2.Start ; Vector1 = edge1.Start - Middle ; Vector2 = edge1.End - Middle ; if( ( Vector*Vector1 >= 0 && Vector*Vector2 >= 0 ) || ( Vector*Vector1 <= 0 && Vector*Vector2 <= 0 )) return true ; return false ; }

4.函数PostProcess()用来删除外部四面体 void PostProcess() { TetrahedronLink* Cur = Head ; TetrahedronLink* Pre , * p ; Triangle Temp ; while( Cur ){ switch( Cur->type ) { case 1: Temp.Point[0] = Cur->volume.Point[0] ; Temp.Point[1] = Cur->volume.Point[1] ;

相关主题