点到直线的距离

点到直线的距离公式

设直线方程为$$Ax+By+C=0$$
点为$$(x_0,y_0)$$
则点到直线的距离为:
$$d = \frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}}$$
代码表示为:

1
2
3
double distance(double A, double B, double C, double x0, double y0) {
return fabs(A*x0+B*y0+C)/sqrt(A*A+B*B);
}

向量投影

假设直线的两个端点为$P_1(x_1,y_1)$和$P_2(x_2,y_2)$,点为$P_0(x_0,y_0)$,则点到直线的距离为:
$$d = \frac{|(P_1-P_0) \times (P_2-P_0)|}{|P_1-P_2|}$$
代码表示为:

1
2
3
double distance(double x1, double y1, double x2, double y2, double x0, double y0) {
return fabs((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0))/sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

点和直线的位置关系

向量叉乘

假设直线的两个端点为$$P_1(x_1,y_1)$$和$$P_2(x_2,y_2)$$,点为$$P_0(x_0,y_0)$$,则点和直线的位置关系为:
$$(P_1-P_0) \times (P_2-P_0)$$

代码表示为:

1
2
3
4
5
6
int position(double x1, double y1, double x2, double y2, double x0, double y0) {
double res = (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
if (res > 0) return 1;
if (res < 0) return -1;
return 0;
}

当该结果返回为0时,说明点直线上,为1时,说明点在直线的左侧,为-1时,说明点在直线的右侧。

该方法的几何意义

  • 叉乘的结果是一个标量,绝对值是平行四边形的面积
  • 结果的符号表示两个向量之间的旋转方向
    • 如果叉乘结果为正,说明$$P_1-P_0$$逆时针旋转到$$P_2-P_0$$,在直线的左侧
    • 如果叉乘结果为负,说明$$P_1-P_0$$顺时针旋转到$$P_2-P_0$$,在直线的右侧
    • 如果叉乘结果为0,说明$$P_1-P_0$$和$$P_2-P_0$$共线