点到直线距离的一种简便实现

前言

没记错的话,点到直线距离的求解应该是一个初中几何的基础问题,不难,但是用代码实现的时候还是需要认真思考一下才写出来。。

首先定义一下问题:

  • 已知: 三个点的坐标,$P(x_1, y_1)$, $Q(x_2, y_2)$, $M(x, y)$
  • 求解: 求点$M$到直线$PQ$的最短距离$d$

基础知识

回忆初中知识,解这个问题需要先从$M$点向$PQ$做垂线,得到垂足$N$,线段$MN$的长度即为所求。

推导过程不是重点,直接上结论,想回忆回忆的话可以看这个

式中,$ABC$是直线$PQ$的一般式方程参数。因为这里已知的是直线上的两点,所以可以先求直线的两点式方程,然后再转化为一般式方程。这也是个基础问题,现成的结论是:

将$ABC$代入距离公式化简之后,可以得到:

则有

由于一般式方程在直线平行于坐标轴时是适用的,因此这个公式在这种情况下也是适用的

代码实现

根据上面最终得到的公式,可以很简便的写出以下C++代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Point{
double x;
double y;
};

double Point2LineDistance(Point start, Point end, Point p){
double A = y2 - y1;
double B = x1 - x2;
double M = x - x1;
double N = y - y1;

return abs(A * M + B * N) / sqrt(pow(A, 2) + pow(B, 2));
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!