diff options
author | Sven Göthel <[email protected]> | 2024-02-12 06:17:07 +0100 |
---|---|---|
committer | Sven Göthel <[email protected]> | 2024-02-12 06:17:07 +0100 |
commit | a77b487a44124a9e55fa9a53d1f9c3ae20b9c3ba (patch) | |
tree | bb9271e933b09bfaa92253bc76e8295f56174041 /src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java | |
parent | bf882af1675f390500cc36c5396f75c394372d52 (diff) |
Bug 1501: Graph Delaunay: Use default winding outer-boundary:=CCW and inner-hole:=CW w/o using winding determination (might be incorrect)
This simplifies our code further and it has been validated that our polygon shoelace-algo for area >= 0 ? CCW
doesn't produce correct results with all curves.
Hence rely on given winding depending on outer-boundary and inner-hole if CDTriangulator2D.FixedWindingRule == true (default and fixed).
This also removes the more costly winding shoelace calculus,
hence Outline ctor only sets dirtyWinding:=true w/o calculating the winding.
Diffstat (limited to 'src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java')
-rw-r--r-- | src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java index d27b7a584..1c2f0b323 100644 --- a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java +++ b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java @@ -79,31 +79,24 @@ public class CDTriangulator2D implements Triangulator { } + /* pp */ static final boolean FixedWindingRule = true; + @Override public final void addCurve(final List<Triangle> sink, final Outline polyline, final float sharpness) { Loop loop = getContainerLoop(polyline); - final Winding winding = polyline.getWinding(); if( null == loop ) { // HEdge.BOUNDARY -> Winding.CCW - int edgeType; - boolean hole; - if( Winding.CCW != winding ) { - System.err.println("CDT2.add.xx.BOUNDARY: !CCW but "+winding); - // polyline.print(System.err); - if( false ) { - edgeType = HEdge.HOLE; - hole = true; - } else { - edgeType = HEdge.BOUNDARY; - hole = false; - polyline.setWinding(Winding.CCW); + final int edgeType = HEdge.BOUNDARY; + final boolean hole = false; + if( !FixedWindingRule ) { + final Winding winding = polyline.getWinding(); + if( Winding.CCW != winding ) { + System.err.println("CDT2.add.xx.BOUNDARY: !CCW but "+winding); + // polyline.print(System.err); + polyline.setWinding(Winding.CCW); // FIXME: Too late? } - } else { - edgeType = HEdge.BOUNDARY; - hole = false; } - // Too late: polyline.setWinding(winding); final GraphOutline outline = new GraphOutline(polyline); final GraphOutline innerPoly = extractBoundaryTriangles(sink, outline, hole, sharpness); // vertices.addAll(polyline.getVertices()); @@ -140,12 +133,14 @@ public class CDTriangulator2D implements Triangulator { Thread.dumpStack(); } } else { + final int edgeType = HEdge.HOLE; + final boolean hole = true; // HEdge.HOLE -> Winding.CW, but Winding.CCW is also accepted! // Winding.CW not required, handled in Loop.initFromPolyline(): polyline.setWinding(winding); final GraphOutline outline = new GraphOutline(polyline); - final GraphOutline innerPoly = extractBoundaryTriangles(sink, outline, true, sharpness); + final GraphOutline innerPoly = extractBoundaryTriangles(sink, outline, hole, sharpness); // vertices.addAll(innerPoly.getVertices()); - loop.addConstraintCurve(innerPoly); + loop.addConstraintCurve(innerPoly, edgeType); } } |