點到直線和點到線段的最短距離


一.點到直線距離

        已知一個點P(X0, Y0), 求點到直線Ax + By + C = 0的距離公式為:d = [AX0 + BY0 + C的絕對值]/[(A^2 + B^2)的算術平方根],如求點P(-1, 2)到直線2X + Y - 10 = 0的距離:X0 = -1, Y0 = 2, A = 2, B = 1, C = -10 代入公式
d =[2 * (-1) + 1 * 2 - 10 的絕對值] / 根號[2 * 2 + 1 * 1] = 10 /
根號5。

        已知兩點的坐便(x1, y1),(x2, y2) ,另外一個點的坐標是(x0, y0); 求(x0, y0)到經過(x1, y1) (x2, y2)直線的距離。
        直線方程中 A = y2 - y1,B = x1- x2,C = x2 * y1 - x1 * y2(叉積);點的直線的距離公式為: double d = (fabs((y2 - y1) * x0 +(x1 - x2) * y0 + ((x2 * y1) -(x1
* y2)))) / (sqrt(pow(y2 - y1, 2) + pow(x1 - x2, 2)))。

二.點到線段最短距離

private static double distance(Point p, Point p1) {
    return Math.hypot(p.x-p1.x, p.y-p1.y);
  }
  //點到線段的最短距離,x0,y0是圓心
  private static double pointToLine(Point p1,Point p2, Point p) {
    double ans = 0;
    double a, b, c;
    a = distance(p1, p2);
    b = distance(p1, p);
    c = distance(p2, p);
    if (c+b==a) {//點在線段上
      ans = 0;
      return ans;
    }
    if (a<=0.00001) {//不是線段,是一個點
      ans = b;
      return ans;
    }
    if (c*c >= a*a + b*b) { //組成直角三角形或鈍角三角形,p1為直角或鈍角
      ans = b;
      return ans;
    }
    if (b * b >= a * a + c * c) {// 組成直角三角形或鈍角三角形,p2為直角或鈍角
      ans = c;
      return ans;
    }
    // 組成銳角三角形,則求三角形的高
    double p0 = (a + b + c) / 2;// 半周長
    double s = Math.sqrt(p0 * (p0 - a) * (p0 - b) * (p0 - c));// 海倫公式求面積
    ans = 2*s / a;// 返回點到線的距離(利用三角形面積公式求高)
    return ans;
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM