earcutLinked function
void
earcutLinked(])
Implementation
void earcutLinked(Node? ear, List<num> triangles, int dim, double minX, double minY, [double? invSize, int? pass]) {
if (ear == null) return;
// interlink polygon nodes in z-order
if (pass == null && invSize != null) indexCurve(ear, minX, minY, invSize);
Node? stop = ear;
Node? prev;
Node? next;
// iterate through ears, slicing them one by one
while (ear!.prev != ear.next) {
prev = ear.prev;
next = ear.next;
if (invSize != null ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
// cut off the triangle
triangles.add(prev!.i / dim);
triangles.add(ear.i / dim);
triangles.add(next!.i / dim);
removeNode(ear);
// skipping the next vertex leads to less sliver triangles
ear = next.next;
stop = next.next;
continue;
}
ear = next;
// if we looped through the whole remaining polygon and can't find any more ears
if (ear == stop) {
// try filtering points and slicing again
if (pass == null || pass == 0) {
earcutLinked(
filterPoints(ear, null), triangles, dim, minX, minY, invSize, 1);
// if this didn't work, try curing all small self-intersections locally
} else if (pass == 1) {
ear = cureLocalIntersections(filterPoints(ear, null), triangles, dim);
earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
// as a last resort, try splitting the remaining polygon into two
} else if (pass == 2) {
splitEarcut(ear, triangles, dim, minX, minY, invSize);
}
break;
}
}
}