inline ARRAY<Wline> bundle_lines(CWpt_list& a, CWpt_list& b) { assert(a.num() == b.num()); ARRAY<Wline> ret(a.num()); for (int i=0; i<a.num(); i++) ret += Wline(a[i], b[i]); return ret; }
Wtransf compute_xf(CWpt_list& p) { Wpt c = p.average(); double s = p.spread(); ARRAY<Wvec> v(p.num()); for (int i=0; i<p.num(); i++) { v += (p[i] - c)/s; } assert(v.num() == p.num()); return Wtransf::translation(c) * compute_xf(v) * Wtransf::translation(-c); }
Wpt_list fold_points(CWpt_list& pts, CWvec& n, bool is_closed) { if (pts.num() < 2) return Wpt_list(); Wpt_list ret(2); // Handle first point specially if (!is_closed || is_fold(pts.last(), pts[0], pts[1], n) ) ret += pts.first(); // Interior points for (int i=1; i<pts.num()-1; i++) if (is_fold(pts[i-1], pts[i], pts[i+1], n)) ret += pts[i]; // Handle last point specially if (!is_closed || is_fold(pts[pts.num()-2], pts.last(), pts.first(), n) ) ret += pts.last(); return ret; }