joinToPolyLine method

List<PolyLine3> joinToPolyLine()

Joins list of Line3 to a single PolyLine3.

Implementation

List<PolyLine3> joinToPolyLine() {
  final polys = <PolyLine3>{};
  for (var l in this) {
    polys.add(PolyLine3([l]));
  }

  var merged = false;
  const eps = 0.0001;
  do {
    merged = false;
    for (var p1 in polys) {
      // closed curve
      if (p1.start == p1.stop && p1.lines.length > 2) {
        continue;
      }

      for (var p2 in polys) {
        if (p1 == p2) {
          continue;
        }

        // distance
        if (p1.stop.distanceTo(p2.start) < eps) {
          polys.remove(p1);
          polys.remove(p2);
          polys.add(PolyLine3([
            ...p1.lines,
            ...p2.lines,
          ]));
          merged = true;
          break;
        } else if (p2.stop.distanceTo(p1.start) < eps) {
          polys.remove(p1);
          polys.remove(p2);
          polys.add(PolyLine3([
            ...p2.lines,
            ...p1.lines,
          ]));
          merged = true;
          break;
        } else if (p1.stop.distanceTo(p2.stop) < eps) {
          polys.remove(p1);
          polys.remove(p2);
          polys.add(PolyLine3([
            ...p1.lines,
            ...p2.lines.reversed.map((e) => Line3(e.b, e.a)),
          ]));
          merged = true;
          break;
        } else if (p1.start.distanceTo(p2.start) < eps) {
          polys.remove(p1);
          polys.remove(p2);
          polys.add(PolyLine3([
            ...p1.lines.reversed.map((e) => Line3(e.b, e.a)),
            ...p2.lines,
          ]));
          merged = true;
          break;
        }
      }
      if (merged) break;
    }
  } while (merged);
  return polys.toList();
}