public class point { float x,y; public point(float _x, float _y) { x = _x; y = _y; } point minus(point p) { return new point(x-p.x,y-p.y); } float mag() { return sqrt(sq(x) + sq(y)); } } float dot(point a, point b, point c) { point AB = b.minus(a); point BC = c.minus(b); return AB.x*BC.x + AB.y*BC.y; } float cross(point a, point b, point c) { point AB = b.minus(a); point AC = c.minus(a); return AB.x*AC.y - AB.y*AC.x; } float distance(point a, point b) { return (a.minus(b)).mag(); } float linePointDistance(point a, point b, point c, boolean isSegment) { if (isSegment) { if (dot(a,b,c)>0) return distance(b,c); if (dot(b,a,c)>0) return distance(a,c); } return (cross(a,b,c)/distance(a,b)); } point nearestPoint(point a, point b, point c, boolean isSegment) { if (isSegment) { if (dot(a,b,c)>0) return b; if (dot(b,a,c)>0) return a; } float segLength = distance(a,b); float segDist = (((c.x-a.x)*(b.x-a.x)) + ((c.y-a.y)*(b.y-a.y)))/(segLength*segLength); return new point(a.x+segDist*(b.x-a.x), a.y+segDist*(b.y-a.y)); }