@@ -110,17 +110,41 @@ private static void Sweep(DTSweepContext tcx)
110110
111111 node = PointEvent ( tcx , point ) ;
112112
113- if ( point . HasEdges )
113+ var internalEdgeList = point . GetInternalEdgeList ( ) ;
114+
115+ if ( internalEdgeList != null )
114116 {
115- foreach ( DTSweepConstraint e in point . GetEdgeIter ( ) )
117+ int j = internalEdgeList . Count ;
118+
119+ if ( tcx . IsDebugEnabled )
116120 {
117- if ( tcx . IsDebugEnabled )
121+ for ( int m = 0 ; m < j ; ++ m )
118122 {
123+ var e = internalEdgeList [ m ] ;
119124 tcx . DTDebugContext . ActiveConstraint = e ;
125+ EdgeEvent ( tcx , e , node ) ;
126+ }
127+ }
128+ else
129+ {
130+ for ( int m = 0 ; m < j ; ++ m )
131+ {
132+ EdgeEvent ( tcx , internalEdgeList [ m ] , node ) ;
120133 }
121- EdgeEvent ( tcx , e , node ) ;
122134 }
123135 }
136+
137+ //if (point.HasEdges)
138+ //{
139+ // foreach (DTSweepConstraint e in point.GetEdgeIter())
140+ // {
141+ // if (tcx.IsDebugEnabled)
142+ // {
143+ // tcx.DTDebugContext.ActiveConstraint = e;
144+ // }
145+ // EdgeEvent(tcx, e, node);
146+ // }
147+ //}
124148 tcx . Update ( null ) ;
125149 }
126150 }
@@ -296,7 +320,7 @@ private static void EdgeEvent(DTSweepContext tcx, DTSweepConstraint edge, Advanc
296320
297321 if ( tcx . IsDebugEnabled ) { tcx . DTDebugContext . PrimaryTriangle = node . Triangle ; }
298322
299- if ( IsEdgeSideOfTriangle ( node . Triangle , edge . P , edge . Q ) ) return ;
323+ if ( MarkEdgeSideOfTriangle ( node . Triangle , edge . P , edge . Q ) ) return ;
300324
301325 // For now we will do all needed filling
302326 // TODO: integrate with flip process might give some better performance
@@ -312,7 +336,7 @@ private static void EdgeEvent(DTSweepContext tcx, DTSweepConstraint edge, Advanc
312336 }
313337 }
314338
315- private static void FillEdgeEvent ( DTSweepContext tcx , DTSweepConstraint edge , AdvancingFrontNode node )
339+ static void FillEdgeEvent ( DTSweepContext tcx , DTSweepConstraint edge , AdvancingFrontNode node )
316340 {
317341 if ( tcx . EdgeEvent . Right )
318342 {
@@ -324,7 +348,7 @@ private static void FillEdgeEvent(DTSweepContext tcx, DTSweepConstraint edge, Ad
324348 }
325349 }
326350
327- private static void FillRightConcaveEdgeEvent ( DTSweepContext tcx , DTSweepConstraint edge , AdvancingFrontNode node )
351+ static void FillRightConcaveEdgeEvent ( DTSweepContext tcx , DTSweepConstraint edge , AdvancingFrontNode node )
328352 {
329353 Fill ( tcx , node . Next ) ;
330354 if ( node . Next . Point != edge . P )
@@ -397,7 +421,7 @@ private static void FillRightAboveEdgeEvent(DTSweepContext tcx, DTSweepConstrain
397421 while ( node . Next . Point . X < edge . P . X )
398422 {
399423 if ( tcx . IsDebugEnabled ) { tcx . DTDebugContext . ActiveNode = node ; }
400- // Check if next node is below the edge
424+
401425 Orientation o1 = TriangulationUtil . Orient2d ( edge . Q , node . Next . Point , edge . P ) ;
402426 if ( o1 == Orientation . CCW )
403427 {
@@ -496,32 +520,37 @@ private static void FillLeftAboveEdgeEvent(DTSweepContext tcx, DTSweepConstraint
496520 }
497521 }
498522
499- private static bool IsEdgeSideOfTriangle ( DelaunayTriangle triangle , TriangulationPoint ep , TriangulationPoint eq )
523+
524+ private static bool MarkEdgeSideOfTriangle ( DelaunayTriangle triangle , TriangulationPoint ep , TriangulationPoint eq )
500525 {
501- int index = triangle . EdgeIndex ( ep , eq ) ;
502- if ( index == - 1 )
503- {
504- return false ;
505- }
506- triangle . MarkConstrainedEdge ( index ) ;
507- switch ( index )
526+ switch ( triangle . EdgeIndex ( ep , eq ) )
508527 {
528+
509529 case 0 :
510- {
511- triangle = triangle . N0 ;
512- } break ;
530+ { //mark constraint
531+ triangle . C0 = true ;
532+ //change triangle here
533+ if ( ( triangle = triangle . N0 ) != null ) { triangle . SelectAndMarkConstrainedEdge ( ep , eq ) ; }
534+ return true ;
535+ }
513536 case 1 :
514537 {
515- triangle = triangle . N1 ;
516- } break ;
517- default :
538+ triangle . C1 = true ;
539+ //change triangle here
540+ if ( ( triangle = triangle . N1 ) != null ) { triangle . SelectAndMarkConstrainedEdge ( ep , eq ) ; }
541+ return true ;
542+ }
543+ case 2 :
518544 {
519- triangle = triangle . N2 ;
520- } break ;
521- }
522-
523- if ( triangle != null ) triangle . SelectAndMarkConstrainedEdge ( ep , eq ) ;
524- return true ;
545+ triangle . C2 = true ;
546+ //change triangle here
547+ if ( ( triangle = triangle . N2 ) != null ) { triangle . SelectAndMarkConstrainedEdge ( ep , eq ) ; }
548+ return true ;
549+ }
550+ default :
551+ //may be -1
552+ return false ;
553+ }
525554 }
526555
527556 private static void EdgeEvent ( DTSweepContext tcx , TriangulationPoint ep , TriangulationPoint eq , DelaunayTriangle triangle , TriangulationPoint point )
@@ -530,7 +559,7 @@ private static void EdgeEvent(DTSweepContext tcx, TriangulationPoint ep, Triangu
530559
531560 if ( tcx . IsDebugEnabled ) tcx . DTDebugContext . PrimaryTriangle = triangle ;
532561
533- if ( IsEdgeSideOfTriangle ( triangle , ep , eq ) ) return ;
562+ if ( MarkEdgeSideOfTriangle ( triangle , ep , eq ) ) return ;
534563
535564 p1 = triangle . PointCCWFrom ( point ) ;
536565 Orientation o1 = TriangulationUtil . Orient2d ( eq , p1 , ep ) ;
@@ -575,7 +604,7 @@ private static void EdgeEvent(DTSweepContext tcx, TriangulationPoint ep, Triangu
575604 FlipEdgeEvent ( tcx , ep , eq , triangle , point ) ;
576605 }
577606 }
578-
607+
579608 /// <summary>
580609 /// In the case of a pointset with some constraint edges. If a triangle side is collinear
581610 /// with a part of the constraint we split the constraint into two constraints. This could
0 commit comments