Point Span::NearestPointToSpan(const Span& p, double &d)const { Point midpoint = MidParam(0.5); Point np = p.NearestPoint(m_p); Point best_point = m_p; double dist = np.dist(m_p); if(p.m_start_span)dist -= (CArea::m_accuracy * 2); // give start of curve most priority Point npm = p.NearestPoint(midpoint); double dm = npm.dist(midpoint) - CArea::m_accuracy; // lie about midpoint distance to give midpoints priority if(dm < dist){dist = dm; best_point = midpoint;} Point np2 = p.NearestPoint(m_v.m_p); double dp2 = np2.dist(m_v.m_p); if(dp2 < dist){dist = dp2; best_point = m_v.m_p;} d = dist; return best_point; }
Point Span::GetVector(double fraction)const { /// returns the direction vector at point which is 0-1 along span if(m_v.m_type == 0){ Point v(m_p, m_v.m_p); v.normalize(); return v; } Point p= MidParam(fraction); Point v(m_v.m_c, p); v.normalize(); if(m_v.m_type == 1) { return Point(-v.y, v.x); } else { return Point(v.y, -v.x); } }