aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
diff options
context:
space:
mode:
authorSven Göthel <[email protected]>2024-02-12 02:31:13 +0100
committerSven Göthel <[email protected]>2024-02-12 02:31:13 +0100
commit277ad1ba1453b7e2e0164f1a609482a36469b2ea (patch)
treeff016d71be66f9e86c6335fef973829063c890b5 /src/jogl/classes/jogamp/graph/curve/tess/CDTriangulator2D.java
parent499d8474247053f47e1f217f5e78fc0f5397f2d9 (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.java45
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--;