Wtransf compute_xf(CWpt_list& p) { Wpt c = p.average(); double s = p.spread(); vector<Wvec> v(p.size()); for (Wpt_list::size_type i=0; i<p.size(); i++) { v[i] = (p[i] - c)/s; } assert(v.size() == p.size()); return Wtransf::translation(c) * compute_xf(v) * Wtransf::translation(-c); }
inline double min_dist(CWpt_list& pts, CWpt_list& path) { if (pts.empty()) return 0; double ret = path.dist(pts[0]); for (Wpt_list::size_type i=1; i<pts.size(); i++) ret = min(ret, path.dist(pts[i])); return ret; }
Wpt_list fold_points(CWpt_list& pts, CWvec& n, bool is_closed) { if (pts.size() < 2) return Wpt_list(); Wpt_list ret(2); // Handle first point specially if (!is_closed || is_fold(pts.back(), pts[0], pts[1], n) ) ret.push_back(pts.front()); // Interior points for (Wpt_list::size_type i=1; i<pts.size()-1; i++) if (is_fold(pts[i-1], pts[i], pts[i+1], n)) ret.push_back(pts[i]); // Handle last point specially if (!is_closed || is_fold(pts[pts.size()-2], pts.back(), pts.front(), n) ) ret.push_back(pts.back()); return ret; }
GELptr WORLD::show_pts( CWpt_list& pts, double width, CCOLOR& col, double alpha, bool depth_test ) { // XXX - Should have dedicated GEL class for this. // This is done in a hurry to get something that // works but is not efficient. for (Wpt_list::size_type i=0; i<pts.size(); i++) show(pts[i], width, col, alpha, depth_test); return nullptr; }