示例#1
0
  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;
  }