9、C++ 外部的一点到四边形的最短距离


在这里插入图片描述

引言

要找到外部的一个点到一个四边形的最短距离,我们需要计算该点到四边形每条边的距离,然后取这些距离中的最小值。

C++ 判断点是否在旋转矩形内部

方法

要找到外部的一个点到一个四边形的最短距离,我们可以按照以下步骤进行:

  1. 确定点和四边形的坐标:设点为 ( P = (x0, y0) ),四边形的顶点为 (A = (x1, y1)),(B = (x2, y2)),(C = (x3, y3)) 和 (D = (x4, y4))。

  2. 计算点到四边形每条边的距离:四边形的每条边可以被视为一条线段。点到线段的最短距离可以通过以下方式计算:

点 ( P ) 到线段 ( AB ) 的距离可以通过以下步骤计算:

  • 如果点不在由线段端点定义的直线上,最短距离是点到直线的垂直距离。
  • 如果点在由线段端点定义的直线上,最短距离是点到线段端点之一的距离。
  • 找到通过点 ( A ) 和 ( B ) 的直线的方程。
  • 计算点 ( P ) 到这条直线的垂直距离。
  • 检查垂直线是否在 ( A ) 和 ( B ) 之间。如果不在,最短距离是 ( P ) 到 ( A ) 或 ( B ) 的距离,取较小者。
  1. 比较点到四边形每条边的距离:在计算了点到四边形每条边的距离后,最短距离是这些距离中的最小值。

让我们将点到四边形每条边的距离表示为 (d1, d2, d3, d4) 。

点到四边形的最短距离是:min(d1, d2, d3, d4)。

程序

以下是一个C++函数,它计算一个点到一个四边形的最短距离:

#include <iostream>
#include <cmath>
#include <algorithm>

struct Point {    
	double x, y;
};

// 计算两点之间的距离
double distance(const Point& a, const Point& b) {
    return std::sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

// 计算点到线段的最短距离
double pointToSegmentDistance(const Point& p, const Point& a, const Point& b) {
	double abx = b.x - a.x;    
	double aby = b.y - a.y;    
	double apx = p.x - a.x;    
	double apy = p.y - a.y;

	double t = (apx * abx + apy * aby) / (abx * abx + aby * aby);

	if (t < 0) {        
		return distance(p, a);    
	} else if (t > 1) {        
		return distance(p, b);    
	} else {        
		Point projection;        
		projection.x = a.x + t * abx;        
		projection.y = a.y + t * aby;        
		return distance(p, projection);    
	}
}

// 计算点到四边形的最短距离
double pointToQuadrilateralDistance(const Point& p, const Point& a, const Point& b, const Point& c, const Point& d) {    
	double d1 = pointToSegmentDistance(p, a, b);    
	double d2 = pointToSegmentDistance(p, b, c);    
	double d3 = pointToSegmentDistance(p, c, d);    
	double d4 = pointToSegmentDistance(p, d, a);
	
  return std::min({d1, d2, d3, d4});
}

int main() {    
	Point p = {-1.0, -0.1};    
	Point a = {0.0, 0.1};    
	Point b = {2.0, 0.0};    
	Point c = {2.0, 2.0};    
	Point d = {0.0, 2.0};
	
  double minDistance = pointToQuadrilateralDistance(p, a, b, c, d);    
  std::cout << "The minimum distance from point to the quadrilateral is: " << minDistance << std::endl;
  
  return 0;
}

这个程序定义了一个计算点到线段最短距离的 pointToSegmentDistance函数,以及一个计算点到四边形最短距离的 pointToQuadrilateralDistance 函数。

小结

在计算点到线段的最短距离时,( t ) 是一个参数,用于确定点在直线上的投影位置。具体来说,( t ) 表示点 ( P ) 在线段 ( AB ) 上的投影位置相对于线段起点 ( A ) 的比例。

  • ( t < 0 ):
    这意味着点 ( P ) 的投影在点 ( A ) 之前,即投影点不在线段 ( AB ) 上,而是在线段延长线的 ( A ) 端之外。在这种情况下,点 ( P ) 到线段 ( AB ) 的最短距离是点 ( P ) 到点 ( A ) 的距离。
  • ( t > 1 ):
    这意味着点 ( P ) 的投影在点 ( B ) 之后,即投影点不在线段 ( AB ) 上,而是在线段延长线的 ( B ) 端之外。在这种情况下,点 ( P ) 到线段 ( AB ) 的最短距离是点 ( P ) 到点 ( B ) 的距离。
  • ( 0≤t≤1 ):
    这意味着点 ( P ) 的投影在线段 ( AB ) 上。在这种情况下,最短距离是点 ( P ) 到投影点的距离。

通过检查 ( t ) 的值,我们可以确定点 ( P ) 的投影位置是否在线段 ( AB ) 上,从而计算出点到线段的最短距离。

另外,在计算点到四边形的最短距离时,四边形的顶点顺序(逆时针或顺时针)并不影响计算结果。这是因为我们是通过计算点到每条边的距离来确定最短距离的,而不是依赖于四边形的内部结构或方向性。

因此,无论是逆时针顺序还是顺时针顺序,只要四边形的顶点按照顺序连接形成四边形的边界,计算点到四边形的最短距离的方法都是相同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值