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

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在MATLAB中,我们可以使用向量运算和标量运算来计算点到线段的最短距离。下面将展示一个简单的MATLAB程序,用于计算点到线段的最短距离。 ```matlab function distance = shortestDistance(point, lineStart, lineEnd) % 计算线段向量 lineVector = lineEnd - lineStart; % 计算点到线段起点的向量 pointVector = point - lineStart; % 计算点到线段结束点的向量 endVector = point - lineEnd; % 计算点到线段起点的投影向量 projectionVector = dot(pointVector, lineVector) / dot(lineVector, lineVector) * lineVector; % 如果投影向量线段向量的范围之外,则最短距离点到线段的起点或结束点的距离 if dot(projectionVector, lineVector) < 0 distance = norm(pointVector); elseif dot(endVector, lineVector) > 0 distance = norm(endVector); else % 否则,最短距离点到投影向量距离 distance = norm(pointVector - projectionVector); end end ``` 在这个程序中,我们定义了一个名为`shortestDistance`的函数,它有三个输入参数:`point`代表点的坐标,`lineStart`代表线段的起点坐标,`lineEnd`代表线段的结束坐标。函数使用向量运算和标量运算来计算点到线段的最短距离。 首先,我们计算线段向量`lineVector`、点到线段起点的向量`pointVector`和点到线段结束点的向量`endVector`。 然后,我们计算点到线段起点的投影向量`projectionVector`,通过点到线段起点向量线段向量的内积除以线段向量的模长,再乘以线段向量。 接下来,我们通过判断投影向量是否在线段向量的范围之外来确定最短距离点到线段的起点或结束点的距离,或是点到投影向量距离。 最后,我们将最短距离返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值