earcutLinked function

void earcutLinked(
  1. Node? ear,
  2. List<num> triangles,
  3. int dim,
  4. double minX,
  5. double minY, [
  6. double? invSize,
  7. int? pass,
])

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;
    }
  }
}