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

给出点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;
}

向量的正交投影

如图给定两个向量xy,那么向量xy上的投影为z
fig8
通过学习我们知道,
                                      cos(\Theta ) = \frac{|z|}{|x|}


点积:

                                      cos(\Theta ) = \frac{x \cdot y}{|x||y|}                      
于是可以推导得

                                     |z|= \frac{x \cdot y}{|y|}
另外我们知道方向向量的,如果u表示向量y的方向向量,  u = \frac{y}{|y|}, 那么向量x在向量y上面的投影可以由下式计算:


                                            |z| = u\cdot x

我们还注意到,向量x在向量y上的投影得到的向量z,它的方向向量和向量y的方向向量是一致的,所以向量z可表示为 z = |z|u.

所以 :  z =\frac{x\cdot y}{|y|} \frac{y}{|y|}  (与图片中手写等式成立)

知道了向量x在向量y上面的投影z后,我们就能够计算向量x-z的距离:
 

fig9

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值