ofVec2f closestPointOnRay(const ofVec2f& p1, const ofVec2f& p2, const ofVec2f& p3) { if(p1 == p2) { return p1; } float u = (p3.x - p1.x) * (p2.x - p1.x); u += (p3.y - p1.y) * (p2.y - p1.y); float len = (p2 - p1).length(); u /= (len * len); return p1.getInterpolated(p2, u); }
ofVec2f closestPointOnLine(const ofVec2f& p1, const ofVec2f& p2, const ofVec2f& p3) { if(p1 == p2) { return p1; } float u = (p3.x - p1.x) * (p2.x - p1.x); u += (p3.y - p1.y) * (p2.y - p1.y); float len = (p2 - p1).length(); u /= (len * len); // clamp u if(u > 1) { u = 1; } else if(u < 0) { u = 0; } return p1.getInterpolated(p2, u); }