⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 straight_skeleton_builder_2_impl.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
📖 第 1 页 / 共 5 页
字号:
  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 + -