Distance fo a point and a line
Table of contents
# Point and point
double p2p(Vector p1, Vector p2) {
return (p2 - p1).length();
}
# Point and line
double p2Line(Vector2 a, Vector2 b, Vector2 p) {
return abs((b - a).cross(p - a)) / (b - a).length();
}
# Point and segment
double p2Seg(Vector2 a, Vector2 b, Vector2 p) {
if ((p - a).dot(b - a) < 0.0) return (p - a).length();
if ((p - b).dot(a - b) < 0.0) return (p - b).length();
return p2Line(a, b, p);
}
# Segment and segment
double distance(Vector2 p1, Vector2 p2, Vector2 p3, Vector2 p4) {
double t3 = (p1.x - p2.x) * (p3.y - p1.y) + (p1.y - p2.y) * (p1.x - p3.x);
double t4 = (p1.x - p2.x) * (p4.y - p1.y) + (p1.y - p2.y) * (p1.x - p4.x);
double t1 = (p3.x - p4.x) * (p1.y - p3.y) + (p3.y - p4.y) * (p3.x - p1.x);
double t2 = (p3.x - p4.x) * (p2.y - p3.y) + (p3.y - p4.y) * (p3.x - p2.x);
if (t3 * t4 < 0 && t1 * t2 < 0) return 0.0;
double min_ = -1;
min_ = min<double>(p2Seg(p1, p2, p3), p2Seg(p1, p2, p4));
min_ = min<double>(min_, p2Seg(p3, p4, p1));
min_ = min<double>(min_, p2Seg(p3, p4, p2));
return min_;
}
Shun
Remote freelancer. A web and mobile application enginner.
Traveling around the world based on East Asia.
I'm looking forward to your job offers from all over the world!