点到直线距离的一种简便实现
前言
没记错的话,点到直线距离的求解应该是一个初中几何的基础问题,不难,但是用代码实现的时候还是需要认真思考一下才写出来。。
首先定义一下问题:
- 已知: 三个点的坐标,$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
13struct 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 协议 ,转载请注明出处!