[几何]点到线段的最短距离 矢量法

 程序代码

#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;
}

猜你喜欢

转载自blog.csdn.net/Mr_HCW/article/details/82816490