private static void fillLeftConcaveEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) { fill( tcx, node.prev ); if( node.prev.point != edge.p ) { // Next above or below edge? if( orient2d( edge.q, node.prev.point, edge.p ) == Orientation.CW ) { // Below if( orient2d( node.point, node.prev.point, node.prev.prev.point ) == Orientation.CW ) { // Next is concave fillLeftConcaveEdgeEvent( tcx, edge, node ); } else { // Next is convex } } } }
private static void fillLeftConvexEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) { // Next concave or convex? if( orient2d( node.prev.point, node.prev.prev.point, node.prev.prev.prev.point ) == Orientation.CW ) { // Concave fillLeftConcaveEdgeEvent( tcx, edge, node.prev ); } else { // Convex // Next above or below edge? if( orient2d( edge.q, node.prev.prev.point, edge.p ) == Orientation.CW ) { // Below fillLeftConvexEdgeEvent( tcx, edge, node.prev ); } else { // Above } } }
private static void fillLeftBelowEdgeEvent( DTSweepContext tcx, DTSweepConstraint edge, AdvancingFrontNode node ) { if( tcx.isDebugEnabled() ) { tcx.getDebugContext().setActiveNode( node ); } if( node.point.getX() > edge.p.getX() ) { if( orient2d( node.point, node.prev.point, node.prev.prev.point ) == Orientation.CW ) { // Concave fillLeftConcaveEdgeEvent( tcx, edge, node ); } else { // Convex fillLeftConvexEdgeEvent( tcx, edge, node ); // Retry this one fillLeftBelowEdgeEvent( tcx, edge, node ); } } }