📄 straight_skeleton_builder_2_impl.h
字号:
if ( !handle_assigned(rResult) ) { if ( !lFound ) { CGAL_STSKEL_BUILDER_TRACE(1,"Split event is no longer valid. Opposite edge vanished."); } else { CGAL_STSKEL_BUILDER_TRACE(1,"Split event is no longer valid. Not inside the opposite edge offset zone."); } } #endif return rResult ;}template<class Gt, class SS, class V>typename Straight_skeleton_builder_2<Gt,SS,V>::Vertex_handle_pairStraight_skeleton_builder_2<Gt,SS,V>::ConstructSplitEventNodes( SplitEvent& aEvent, Vertex_handle aOppR ){ Vertex_handle_pair rResult; CGAL_STSKEL_BUILDER_TRACE ( 2, "Creating SplitEvent Nodes" ) ; Vertex_handle lOppL = GetPrevInLAV(aOppR) ; Vertex_handle lNodeA = mSSkel->SSkel::Base::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time() ) ) ; Vertex_handle lNodeB = mSSkel->SSkel::Base::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time() ) ) ; mSLAV.push_back(lNodeA); mSLAV.push_back(lNodeB); InitVertexData(lNodeA); InitVertexData(lNodeB); SetSeededTrisegment(lNodeA,aEvent.strisegment()); SetSeededTrisegment(lNodeB,aEvent.strisegment()); Vertex_handle lSeed = aEvent.seed0() ; Halfedge_handle lXOutBisector = lSeed->primary_bisector() ; Halfedge_handle lXInBisector = lXOutBisector->opposite(); lNodeA->VBase::set_halfedge(lXOutBisector); // lNodeB hafledge is set outside with the New In Bisector to the Right. lXOutBisector->HBase_base::set_vertex(lNodeA); CGAL_STSKEL_BUILDER_TRACE ( 3, "Seed: N" << lSeed->id() << " proccesed" ) ; SetIsProcessed(lSeed) ; mSLAV.remove(lSeed); CGAL_STSKEL_BUILDER_TRACE ( 2, 'N' << lNodeA->id() << " and N" << lNodeB->id() << " inserted into LAV." ) ; Vertex_handle lPrev = GetPrevInLAV(lSeed) ; Vertex_handle lNext = GetNextInLAV(lSeed) ; SetNextInLAV(lPrev , lNodeA ) ; SetPrevInLAV(lNodeA, lPrev ) ; SetNextInLAV(lNodeA, aOppR ) ; SetPrevInLAV(aOppR , lNodeA ) ; SetNextInLAV(lOppL , lNodeB ) ; SetPrevInLAV(lNodeB, lOppL ) ; SetNextInLAV(lNodeB, lNext ) ; SetPrevInLAV(lNext , lNodeB ) ; CGAL_STSKEL_BUILDER_TRACE ( 2 , "Updated LAV: N" << lPrev->id() << "->N" << lNodeA->id() << "->N" << aOppR->id() << std::endl << "Updated LAV: N" << lOppL->id() << "->N" << lNodeB->id() << "->N" << lNext->id() << std::endl << 'N' << lSeed->id() << " removed from LAV" ); rResult = std::make_pair(lNodeA,lNodeB); mSplitNodes.push_back(rResult); return rResult ;}template<class Gt, class SS, class V>typename Straight_skeleton_builder_2<Gt,SS,V>::Vertex_handle_pairStraight_skeleton_builder_2<Gt,SS,V>::ConstructPseudoSplitEventNodes( PseudoSplitEvent& aEvent ){ Vertex_handle_pair rResult; CGAL_STSKEL_BUILDER_TRACE ( 2, "Creating PseudoSplitEvent Nodes" ) ; Vertex_handle lLSeed = aEvent.seed0() ; Vertex_handle lRSeed = aEvent.seed1() ; Vertex_handle lNewNodeA = mSSkel->SSkel::Base::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; Vertex_handle lNewNodeB = mSSkel->SSkel::Base::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; mSLAV.push_back(lNewNodeA); mSLAV.push_back(lNewNodeB); InitVertexData(lNewNodeA); InitVertexData(lNewNodeB); SetSeededTrisegment(lNewNodeA,aEvent.strisegment()); SetSeededTrisegment(lNewNodeB,aEvent.strisegment()); Halfedge_handle lLOBisector = lLSeed->primary_bisector(); Halfedge_handle lROBisector = lRSeed->primary_bisector(); Halfedge_handle lLIBisector = lLOBisector->opposite(); Halfedge_handle lRIBisector = lROBisector->opposite(); lNewNodeA->VBase::set_halfedge(lLOBisector); lNewNodeB->VBase::set_halfedge(lROBisector); lLOBisector->HBase_base::set_vertex(lNewNodeA); lROBisector->HBase_base::set_vertex(lNewNodeB); lLIBisector->HBase_base::set_prev( lROBisector ) ; lROBisector->HBase_base::set_next( lLIBisector ) ; lLOBisector->HBase_base::set_next( lRIBisector ) ; lRIBisector->HBase_base::set_prev( lLOBisector ) ; CGAL_STSKEL_BUILDER_TRACE ( 3 , "LSeed: N" << lLSeed->id() << " proccesed\n" << "RSeed: N" << lRSeed->id() << " proccesed" ) ; SetIsProcessed(lLSeed) ; SetIsProcessed(lRSeed) ; mSLAV.remove(lLSeed); mSLAV.remove(lRSeed); Vertex_handle lLPrev = GetPrevInLAV(lLSeed) ; Vertex_handle lLNext = GetNextInLAV(lLSeed) ; Vertex_handle lRPrev = GetPrevInLAV(lRSeed) ; Vertex_handle lRNext = GetNextInLAV(lRSeed) ; SetPrevInLAV(lNewNodeA, lLPrev ) ; SetNextInLAV(lLPrev , lNewNodeA ) ; SetNextInLAV(lNewNodeA, lRNext ) ; SetPrevInLAV(lRNext , lNewNodeA ) ; SetPrevInLAV(lNewNodeB, lRPrev ) ; SetNextInLAV(lRPrev , lNewNodeB ) ; SetNextInLAV(lNewNodeB, lLNext ) ; SetPrevInLAV(lLNext , lNewNodeB ) ; CGAL_STSKEL_BUILDER_TRACE ( 2 , "LO: B" << lLOBisector->id() << " LI: B" << lLIBisector->id() << " RO: B" << lROBisector->id() << " RI: B" << lRIBisector->id() << '\n' << "NewNodeA: N" << lNewNodeA->id() << " at " << lNewNodeA->point() << '\n' << "NewNodeB: N" << lNewNodeB->id() << " at " << lNewNodeB->point() << '\n' << "New Links: B" << lROBisector->id() << "->B" << lLIBisector->id() << '\n' << 'N' << lNewNodeA->id() << " and N" << lNewNodeB->id() << " inserted into LAV:\n" << 'N' << lLPrev->id() << "->N" << lNewNodeA->id() << "->N" << lRNext->id() << '\n' << 'N' << lRPrev->id() << "->N" << lNewNodeB->id() << "->N" << lLNext->id() << '\n' << 'N' << lLSeed->id() << " removed from LAV\n" << 'N' << lRSeed->id() << " removed from LAV" ); rResult = std::make_pair(lNewNodeA,lNewNodeB); mSplitNodes.push_back(rResult); return rResult ;}template<class Gt, class SS, class V>bool Straight_skeleton_builder_2<Gt,SS,V>::IsProcessed( EventPtr aEvent ){ return IsProcessed(aEvent->seed0()) || IsProcessed(aEvent->seed1()) ;}template<class Gt, class SS, class V>void Straight_skeleton_builder_2<Gt,SS,V>::HandleEdgeEvent( EventPtr aEvent ){ EdgeEvent& lEvent = dynamic_cast<EdgeEvent&>(*aEvent) ; Vertex_handle lLSeed = lEvent.seed0() ; Vertex_handle lRSeed = lEvent.seed1() ; Vertex_handle lNewNode = ConstructEdgeEventNode(lEvent); Halfedge_handle lLOBisector = lLSeed->primary_bisector() ; Halfedge_handle lROBisector = lRSeed->primary_bisector() ; Halfedge_handle lLIBisector = lLOBisector->opposite(); Halfedge_handle lRIBisector = lROBisector->opposite(); if ( !handle_assigned(lLOBisector->next()) && !handle_assigned(lRIBisector->prev()) ) { CGAL_STSKEL_BUILDER_TRACE(3,"Creating new Edge Event's Bisector"); Halfedge_handle lNOBisector = mSSkel->SSkel::Base::edges_push_back ( Halfedge(mEdgeID),Halfedge(mEdgeID+1) ); Halfedge_handle lNIBisector = lNOBisector->opposite(); mEdgeID += 2 ; lRIBisector->HBase_base::set_prev(lNIBisector); lNIBisector->HBase_base::set_next(lRIBisector); lNOBisector->HBase_base::set_face(lLOBisector->face()); lNIBisector->HBase_base::set_face(lRIBisector->face()); lNIBisector->HBase_base::set_vertex(lNewNode); lLOBisector->HBase_base::set_next(lNOBisector); lNOBisector->HBase_base::set_prev(lLOBisector); Halfedge_handle lDefiningBorderA = lNewNode->halfedge()->face()->halfedge(); Halfedge_handle lDefiningBorderB = lNewNode->halfedge()->opposite()->prev()->opposite()->face()->halfedge(); Halfedge_handle lDefiningBorderC = lNewNode->halfedge()->opposite()->prev()->face()->halfedge(); SetTriedge(lNewNode, Triedge(lDefiningBorderA,lDefiningBorderB,lDefiningBorderC) ) ; CGAL_STSKEL_BUILDER_TRACE ( 2 , "NewNode N" << lNewNode->id() << " at " << lNewNode->point() << " defining borders: E" << lDefiningBorderA->id() << ",E" << lDefiningBorderB->id() << ",E" << lDefiningBorderC->id() << '\n' << "New Bisectors:\nB" << lNOBisector->id() << " [E" << lNOBisector->defining_contour_edge()->id() << ",E" << lNOBisector->opposite()->defining_contour_edge()->id() << "] (Out: Prev: B" << lNOBisector->prev()->id() << ")\nB" << lNIBisector->id() << " [E" << lNIBisector->defining_contour_edge()->id() << ",E" << lNIBisector->opposite()->defining_contour_edge()->id() << "] (In: Next: B" << lNIBisector->next()->id() << ")\n" << "N" << lNewNode->id() << " halfedge: " << lNewNode->halfedge()->id() << " primary bisector: B" << lNewNode->primary_bisector()->id() ) ; UpdatePQ(lNewNode); } else { Halfedge_handle lDefiningBorderA = lNewNode->halfedge()->face()->halfedge(); Halfedge_handle lDefiningBorderB = lNewNode->halfedge()->opposite()->prev()->opposite()->face()->halfedge(); Halfedge_handle lDefiningBorderC = lNewNode->halfedge()->opposite()->prev()->face()->halfedge(); SetTriedge(lNewNode, Triedge(lDefiningBorderA,lDefiningBorderB,lDefiningBorderC) ) ; CGAL_STSKEL_BUILDER_TRACE(2 , "NewNode N" << lNewNode->id() << " at " << lNewNode->point() << " defining borders:" << " E" << lDefiningBorderA->id() << ",E" << lDefiningBorderB->id() << ",E" << lDefiningBorderC->id() << ".\nThis is a multiple node (A node with these defining edges already exist in the LAV)" ); } mVisitor.on_edge_event_processed(lLSeed,lRSeed,lNewNode) ; }template<class Gt, class SS, class V>void Straight_skeleton_builder_2<Gt,SS,V>::HandleSplitEvent( EventPtr aEvent, Vertex_handle aOppR ){ SplitEvent& lEvent = dynamic_cast<SplitEvent&>(*aEvent) ; Halfedge_handle lOppBorder = lEvent.triedge().e2() ; Vertex_handle lSeed = lEvent.seed0(); Vertex_handle lNewNode_L, lNewNode_R ; boost::tie(lNewNode_L,lNewNode_R) = ConstructSplitEventNodes(lEvent,aOppR); Triedge lTriedge = aEvent->triedge(); Halfedge_handle lReflexLBorder = lTriedge.e0(); Halfedge_handle lReflexRBorder = lTriedge.e1(); Halfedge_handle lNOBisector_L = mSSkel->SSkel::Base::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); Halfedge_handle lNOBisector_R = mSSkel->SSkel::Base::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); Halfedge_handle lNIBisector_L = lNOBisector_L->opposite(); Halfedge_handle lNIBisector_R = lNOBisector_R->opposite(); lNewNode_R->VBase::set_halfedge(lNIBisector_L) ; Halfedge_handle lXOBisector = lSeed->primary_bisector() ; Halfedge_handle lXIBisector = lXOBisector->opposite(); lNOBisector_L->HBase_base::set_face(lXOBisector->face()); lNIBisector_L->HBase_base::set_face(lOppBorder ->face()); lNOBisector_R->HBase_base::set_face(lOppBorder ->face()); lNIBisector_R->HBase_base::set_face(lXIBisector->face()); lNIBisector_L->HBase_base::set_vertex(lNewNode_R); lNIBisector_R->HBase_base::set_vertex(lNewNode_R); lXOBisector ->HBase_base::set_next(lNOBisector_L); lNOBisector_L->HBase_base::set_prev(lXOBisector); lXIBisector ->HBase_base::set_prev(lNIBisector_R); lNIBisector_R->HBase_base::set_next(lXIBisector); lNIBisector_L->HBase_base::set_next(lNOBisector_R); lNOBisector_R->HBase_base::set_prev(lNIBisector_L); Halfedge_handle lNewNode_L_DefiningBorderA = lNewNode_L->halfedge()->face()->halfedge(); Halfedge_handle lNewNode_L_DefiningBorderB = lNewNode_L->halfedge()->opposite()->prev()->opposite()->face()->halfedge(); Halfedge_handle lNewNode_L_DefiningBorderC = lNewNode_L->halfedge()->opposite()->prev()->face()->halfedge(); Halfedge_handle lNewNode_R_DefiningBorderA = lNewNode_R->halfedge()->face()->halfedge(); Halfedge_handle lNewNode_R_DefiningBorderB = lNewNode_R->halfedge()->opposite()->prev()->opposite()->face()->halfedge(); Halfedge_handle lNewNode_R_DefiningBorderC = lNewNode_R->halfedge()->opposite()->prev()->face()->halfedge(); SetTriedge(lNewNode_L, Triedge(lNewNode_L_DefiningBorderA,lNewNode_L_DefiningBorderB,lNewNode_L_DefiningBorderC) ) ; SetTriedge(lNewNode_R, Triedge(lNewNode_R_DefiningBorderA,lNewNode_R_DefiningBorderB,lNewNode_R_DefiningBorderC) ) ; CGAL_STSKEL_BUILDER_TRACE ( 2 , "New Node L: N" << lNewNode_L->id() << " at " << lNewNode_L->point() << " defining borders: E" << lNewNode_L_DefiningBorderA->id() << ",E" << lNewNode_L_DefiningBorderB->id() << ",E" << lNewNode_L_DefiningBorderC->id() << '\n' << "New Node R: N" << lNewNode_R->id() << " at " << lNewNode_R->point() << " defining borders: E" << lNewNode_R_DefiningBorderA->id() << ",E" << lNewNode_R_DefiningBorderB->id() << '\n' << ",E" << lNewNode_R_DefiningBorderC->id() << '\n' << "New Bisector OL:\nB" << lNOBisector_L->id() << "[E" << lNOBisector_L ->defining_contour_edge()->id() << ",E" << lNOBisector_L->opposite()->defining_contour_edge()->id() << "]" << " (Out: Prev: B" << lNOBisector_L->prev()->id() << ")\n" << "New Bisector IL:\nB" << lNIBisector_L->id() << "[E" << lNIBisector_L ->defining_contour_edge()->id() << ",E" << lNIBisector_L->opposite()->defining_contour_edge()->id() << "]" << " (In: Next: B" << lNIBisector_L->next()->id() << ")\n"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -