1. 程式人生 > >[計算幾何] (平面上)點到線段的最短距離 向量法

[計算幾何] (平面上)點到線段的最短距離 向量法

 給出點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;
}

如果覺得本文對你有啟發, 不妨贊一下, 在精神上鼓勵鼓勵博主;

如果有不懂的地方, 可以在下方留言, 博主一看到便會馬上回復;

如果發現本文有錯誤的地方, 歡迎指正。