[计算几何] (平面上)点到线段的最短距离 矢量法
给出点A、B的坐标, 构成线段AB, 再给出一点P的坐标, 求点P到线段AB的最短距离
程序代码
#include<cmath>
#include<iostream>
using namespace std;
typedef struct node
{
double x, y;
}*PNODE,NODE;
double getDis2(NODE a, NODE b) //得到两点距离的平方
{
return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y);
}
double disMin(NODE A, NODE B,NODE P)
{
double r = ((P.x - A.x)*(B.x - A.x) + (P.y - A.y)*(B.y - A.y)) / getDis2(A,B);
if (r <= 0) return sqrt(getDis2(A,P)); //第一种情况, 返回AP的长
else if (r >= 1) return sqrt(getDis2(B,P)); //第二种情况, 返回BP的长度
else //第三种情况, 返回PC的长度
{
double AC = r*sqrt(getDis2(A,B)); //先求AC的长度,(AC=r*|AB|)
return sqrt(getDis2(A,P)-AC*AC); //再勾股定理返回PC的长度
}
}
int main()
{
NODE A, B, P;
cin >> A.x >> A.y;
cin >> B.x >> B.y;
cin >> P.x >> P.y;
cout << disMin(A, B, P) << endl;
return 0;
}
如果觉得本文对你有启发, 不妨赞一下, 在精神上鼓励鼓励博主;
如果有不懂的地方, 可以在下方留言, 博主一看到便会马上回复;
如果发现本文有错误的地方, 欢迎指正。