FilterDupsAndColinear function

List<Vector2> FilterDupsAndColinear(
  1. List<Vector2> contour
)

Implementation

List<VM.Vector2> FilterDupsAndColinear(final List<VM.Vector2> contour) {
  List<VM.Vector2> out = <VM.Vector2>[];
  final cl = contour.length;
  out.add(contour[0]);
  for (int i = 1; i < cl - 1; ++i) {
    final VM.Vector2 v0 = out.last;
    final VM.Vector2 v1 = contour[i];
    if (v0 == v1) continue;
    final VM.Vector2 v2 = contour[i + 1];
    if (Colinear(v0, v1, v2)) continue;
    out.add(v1);
  }

  VM.Vector2 v0 = out.last;
  VM.Vector2 v1 = contour.last;
  final VM.Vector2 v2 = out.first;
  if (v1 == v2) {
    v1 = out.removeLast();
    v0 = out.last;
  }
  if (v0 == v1) {
    v1 = out.removeLast();
    v0 = out.last;
  }
  // at this point v0 != v1 != v2
  if (!Colinear(v0, v1, v2)) {
    out.add(v1);
  }
  return out;
}