public static Point closestPoint(Vec2d seg_a, Vec2d seg_b, Point circleOrigin) { Vec2d seg_v = seg_b.sub(seg_a); Vec2d pt_v = new Vec2d(circleOrigin.getX(), circleOrigin.getY()).sub(seg_a); Vec2d seg_v_unit = seg_v.div(seg_v.Length()); double proj = pt_v.Dot(seg_v_unit); Point closest; if (proj <= 0) { closest = new Point(seg_a.x, seg_b.x); } else if (proj >= seg_v.Length()) { closest = new Point(seg_b.x, seg_b.x); } else { Vec2d proj_v = seg_v_unit.mul(proj); Vec2d newVec = proj_v.add(seg_a); closest = new Point(newVec.x, newVec.y); } return closest; }