diff options
author | Sven Göthel <[email protected]> | 2024-02-12 02:31:13 +0100 |
---|---|---|
committer | Sven Göthel <[email protected]> | 2024-02-12 02:31:13 +0100 |
commit | 277ad1ba1453b7e2e0164f1a609482a36469b2ea (patch) | |
tree | ff016d71be66f9e86c6335fef973829063c890b5 /src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java | |
parent | 499d8474247053f47e1f217f5e78fc0f5397f2d9 (diff) |
Bug 1501: Graph Delaunay: Add double triAreaVec2() and isInCircleVec2() version, overcome float precision; Loop: Pass edgeType not Winding, simplify findClosestValidNeighbor() -> isValidNeighbor(); CDTriangulator2D.addCurve() enforces Winding.CCW on BOUNDARY null == loop case
Add double version of triAreaVec2() and isInCircleVec2() in VectorUtil, overcoming float precision limits
- Analysis exposed float precision limits within isInCircleVec2()
Loop: Pass edgeType not Winding, simplify findClosestValidNeighbor() -> isValidNeighbor()
- Enhance code clarity
CDTriangulator2D.addCurve() enforces Winding.CCW on BOUNDARY null == loop case
Diffstat (limited to 'src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java')
-rw-r--r-- | src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java index fe1aad169..d27b7a584 100644 --- a/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java +++ b/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java @@ -83,14 +83,32 @@ public class CDTriangulator2D implements Triangulator { 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 ) { - final Winding winding = Winding.CCW; // -> HEdge.BOUNDARY + // 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); + } + } else { + edgeType = HEdge.BOUNDARY; + hole = false; + } // Too late: polyline.setWinding(winding); - final GraphOutline outline = new GraphOutline(polyline); // , winding); - final GraphOutline innerPoly = extractBoundaryTriangles(sink, outline, false, sharpness); + final GraphOutline outline = new GraphOutline(polyline); + final GraphOutline innerPoly = extractBoundaryTriangles(sink, outline, hole, sharpness); // vertices.addAll(polyline.getVertices()); if( innerPoly.getGraphPoint().size() >= 3 ) { - loop = Loop.create(innerPoly, winding); + loop = Loop.create(innerPoly, edgeType); if( null != loop ) { loops.add(loop); } @@ -122,9 +140,9 @@ public class CDTriangulator2D implements Triangulator { Thread.dumpStack(); } } else { - // final Winding winding = Winding.CW; // -> HEdge.HOLE - // Not required, handled in Loop.initFromPolyline(): polyline.setWinding(winding); - final GraphOutline outline = new GraphOutline(polyline); // , winding); + // 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); // vertices.addAll(innerPoly.getVertices()); loop.addConstraintCurve(innerPoly); @@ -140,14 +158,13 @@ public class CDTriangulator2D implements Triangulator { int size = loop.computeLoopSize(); while(!loop.isSimplex()){ final Triangle tri; - final boolean delauny; - if(numTries > size){ + final boolean delaunay; + if(numTries > size) { tri = loop.cut(false); - delauny = false; - } - else{ + delaunay = false; + } else { tri = loop.cut(true); - delauny = true; + delaunay = true; } numTries++; @@ -155,7 +172,7 @@ public class CDTriangulator2D implements Triangulator { tri.setId(maxTriID++); sink.add(tri); if(DEBUG){ - System.err.println("CDTri.gen["+i+"].0: delauny "+delauny+", tries "+numTries+", size "+size+", "+tri); + System.err.println("CDTri.gen["+i+"].0: delaunay "+delaunay+", tries "+numTries+", size "+size+", "+tri); } numTries = 0; size--; |