[计算几何] (平面上)点到线段的最短距离 矢量法

 给出点A、B的坐标, 构成线段AB, 再给出一点P的坐标, 求点P到线段AB的最短距离

 

 程序代码

#include<cmath>
#include<iostream>
using namespace std;
typedef struct node
{
	double x, y;
}Point;
double getDis2(Point a, Point b)  //得到两点距离的平方
{
	return (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y);
}

double disMin(Point A, Point B,Point 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()
{
	Point 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;
}

 

如果觉得本文对你有启发, 不妨赞一下, 在精神上鼓励鼓励博主;

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

如果发现本文有错误的地方, 欢迎指正。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值