joinToPolyLine method
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();
}