(伪)点到线段的距离 C++

点到线段的距离 题解(C++) 原题目:wzoi P573 初步分析 这道题之前有《点到直线的距离》一题。 如图,我们不妨来下个定义(名字是乱起的,如果有雷同就以以下定义为准): 对于任意线段l,在其两个端点上分别作垂直于l的直线,若点在两直线之间,则称点在“线段范围内”,否则在“线段范围外”。 这两条直线(蓝色的两条)称为“线段范围界线”。 上图中,点A在线段范围内,点B和点C都在线段范围外。 不难发现,当点在线段范围内,则点到线段的距离即点到线段所在直线的距离,套公式即可。 当点在线段范围外,则点到线段的距离即点到 阅读详情

之前写过一篇关于点到直线距离的文章,这回我来研究一下点到线段距离。

 

回顾一下,推导出的点到直线距离公式为:

详细请见原博客。

 

分析

在某种情况下,线段外一点P到线段AB的距离可以看做上述P到直线AB的距离:

就像这样子:

但是这样却不行(蓝线为实际距离,红线为到直线距离):

 

不难看出:

三角形ABP的形状点到线段的距离
锐角三角形P到直线AB的距离
直角三角形

PA,PB的较小者;P到直线AB的距离

钝角三角形PA,PB的较小者

 

 

如图所示。

 

判断三角形的形状

不妨设三边中,最短的两边为a,b,最长边为c。

不难想到,判断直角三角形,就用勾股定理:。

对于锐角三角形:

同理推出,在钝角三角形中,。

接下来,便是令人兴奋的代码了。

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
double dist(double x1,double x2,double y1,double y2)
{return sqrt(pow(x2-x1,2)+pow(y2-y1,2));}//返回(x1,y1),(x2,y2)之间的距离 
int main()
{
	double x1,x2,x3,y1,y2,y3;
	/*A(x1,y1)
	  B(x2,y2)
	  P(x3,y3)*/
	cin>>x1>>y1>>x2>>y2>>x3>>y3;
	//判断三角形形状
	double a,b,c,d;
	a=dist(x1,x2,y1,y2);
	b=dist(x2,x3,y2,y3);
	c=dist(x1,x3,y1,y3);
	if(c<a or c<b)
	{
		if(c<a)
		{
			int t=a;
			a=c;
			c=t;
		}
		if(c<b)
		{
			int t=b;
			b=c;
			c=t;
		}
	}
	if(a*a+b*b<=c*c)//直角三角形或钝角三角形 
	d=min(dist(x1,x3,y1,y3),dist(x2,x3,y2,y3));
	else
	d=sqrt(pow((x3-x1)*(y2-y1)+(y3-y1)*(x1-x2),2)/(pow(y2-y1,2)+pow(x1-x2,2)));
	printf("%.3lf",d);
	return 0;
}

但是... ...

 

有2个测试点没过。80分。

 

是哪儿出了问题呢?

 

#以下是改来改去的过程。比较乱。请选择性阅读。#

 

[灵光一闪]   哦!会不会是没考虑到点在线段(所在直线)上的情况呢?

返回判断三角形的那一步,我们考虑一下这种情况。

让我来改一下代码。

if(a*a+b*b<=c*c)//直角三角形或钝角三角形 
	{
		d=min(dist(x1,x3,y1,y3),dist(x2,x3,y2,y3));
		if(a+b==c)//点在线段上
		d=0; 
	}

在此做修改(原代码36行)。

看看对不对呢......?!

 

 

Emmm mmmm mmmm... ... ...(不要急不要急不要急)

[灵光再现] 我使了个坏。看到锐角三角形部分有些乱,会不会是那里错了?

于是我把else后面的计算部分删了,交了上去。

哈哈哈哈!找到了!还是80分,也就是说,是else后的计算错了!

 

让我来换个思路。

由于d是P垂直AB的长度,即AB边上的高,所以通过面积法即可求出!

不知道大家知不知道,有一条根据边长计算面积的公式,叫海伦公式。

于是,求出面积,除以AB即可。

if(a*a+b*b>c*c)
{
	int p=(dist(x1,x2,y1,y2)+dist(x1,x3,y1,y3)+dist(x3,x2,y3,y2));
	int s=sqrt(p*(p-dist(x1,x2,y1,y2))*(p-dist(x3,x2,y3,y2))*(p-dist(x1,x3,y1,y3)));
	d=s/dist(x1,x2,y1,y2);
}

 

。。。还是80分。(烂尾警告)

等我!我会搞好的!

VTK C++ 实现点到线段距离计算:原理、代码与实战应用 在三维可视化与几何计算领域,点到直线或线段的距离计算是一项基础且关键的几何操作。其核心原理基于向量投影与参数化方程,通过计算点在直线上的垂足或到端点的最短距离来实现。这一基础几何功能在工程实践中具有极高的技术价值,是构建更复杂算法的基石,例如在碰撞检测、路径规划、网格质量分析和点云配准等场景中,精确的距离计算直接决定了算法的精度与效率。利用成熟的开源库如VTK(Visualization Toolkit)进行实现,不仅能保证计算的数值稳定性与高性能,还能通过其丰富的几何类(如vtkLine)和数据模型,将基 阅读详情

相关推荐

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

给出点A、B的坐标, 构成线段AB, 再给出一点P的坐标, 求点P到线段AB的最短距离 程序代码 #include&lt;cmath&gt; #include&lt;iostream&gt; using namespace std; typedef struct node { double x, y; }*PNODE,NODE; double getDis2(NODE a, ...

looeyWei的博客 4217

C++实现计算点到线段距离

如果线段长度为0,即线段为点,则直接计算点到该点的距离。否则,计算点到线段两个端点的连线的垂足在线段上的位置,即参数r。如果r小于等于0,则垂足在p1处;否则,垂足在线段上,计算垂足的坐标,并计算点到垂足的距离。然后,定义了一个distanceToLineSegment函数,它接受一个点p和一个线段l作为参数,并计算点到线段的距离。定义了两个结构体:Point表示一个点,LineSegment表示一个线段,由两个点p1和p2组成。在main函数中,我们定义了一个点p和一个线段l,并计算了点到线段的距离。

好好学习 1849

求点到线段的距离

求点到线段的距离

【C++】计算点到线段的最短距离

首先我们要判断点在线段端点的两侧(1,3)还是在两个端点之间(2)。假设p垂直于直线AB的交点为C,我们只需要计算出。但是由于我们使用的是浮点数,有效位数只能达到六位,即超过六位就会去掉。夹角不会等于0°,这时候我们需要设置一个临界值进行判断,比如他们夹角小于1°我们即视为同方向。实现代码如下(这里有些是unity的API,就是求长度和点积,需要换成不同语言的API)理论上,我们获取到交点C后,我们计算。如果是直角,sin(x)=1,|最短距离分别是AP,CP,BP.计算中得到的值是有误差的,即。...

lemonxiaoxiao的博客 3840

计算点到线段的最短距离

这个计算点到线段最短距离算法是先计算线段上距离点最近的点,然后求出 2 点距离。在计算用户到当前位置到某条公路的最短距离等实际情况中,可以先用这个算法,然后根据结果坐标使用 CLLocation 类的函数计算实际距离 VC6工程

人形机器人大语言模型 pi*0.6(π*0.6):最新从经验中学习的VLA

摘要:本文介绍了一种名为Recap的机器人学习方法,通过示范训练、纠错指导和强化学习三个步骤提升机器人执行复杂任务的能力。研究显示,仅依靠模仿学习的机器人难以解决错误累积问题,而Recap方法通过价值函数可视化和优势条件策略训练,使π*0.6模型在咖啡制作、纸箱组装和衣物折叠等任务中的成功率提升超过90%,吞吐量翻倍。该方法突破了传统依赖人工演示的局限,通过自主经验学习实现机器人性能的持续优化,为未来机器人基础模型的发展提供了新方向。

2506_90492529的博客 1320

C++功能模块8:点到线段的最短距离

在二维平面上,给出三个点的坐标分别为A(ax,ay), B(bx,by), C(cx,cy),求点A到线段BC的最短距离。从点A向直线BC作垂线,垂足可能在线段BC的左侧,在线段BC上,或者在线段BC的右侧三种情况,下面分别讨论。最短距离是三角形ABC以边BC的高,可通过海伦公式先求出面积,再求出高得到答案。最短距离显然是AB。

m0_37635769的博客 2369

Apifox接口测试+自动化测试

Apifox 接口测试+自动化测试快速入门!

程序员小杨哥的博客 1万+

C++求点到线段和任意曲线的最短距离

(2)C++基本数据类型和函数的定义和使用 编写C++程序,实现: ①给定任意一个点P和一条线段AB,计算点P到AB的最短距离; 图1点到直线最短距离示意图 计算点到线段最短距离的算法描述: 1)计算向量A->P,A->B; 2)定义r1=|AP|cos(a) = dot((A->P)(A->B))/|AB|,表示向量A->P在A->B方向上的投影长度;其中,a是向量A->P与A->B的夹角;dot()是向量点乘; 3)定义r2=r...

weixin_54194955的博客 2308

OpenCV自学记录(1)——(一拳超人)图像处理基础(图像获取、图像变化)

学习深度学习进行图像分类和目标检测时,要有一定的图像处理的基础。在学习深度学习之前,看了一本《图像处理技术基础》,现在也忘得差不多了,后悔当初没有整理记录下来。现在整理一下图像处理的常用方法,最后实现一个小项目——基于OpenCV的车牌号识别。 OpenCV自学记录(1)——图像处理基础(一)1、图像获取1.1获取图像数据1.2 获取摄像头图像数据2、图像变化2.1 移动(translation)...

qq_40784418的博客 1456

YOLO26改进策略【卷积层】| DWRSeg :高效获取多尺度上下文信息,二次改进C3k2

本文记录的是利用DWR 模块改进 YOLO26 的特征提取部分。(Dilation-wise Residual)通过两步残差流程(区域残差化-语义残差化)与分支化空洞卷积结合,引导解码器处理特征与跳接特征的多尺度精准融合。本文利用模块,通过区域残差化生成简洁区域型特征图以简化融合基础,再通过分支化空洞卷积捕捉多尺度空间上下文,同时依托残差连接保留原始特征信息,对YOLO26中不同尺度目标特征进行针对性强化、抑制无效背景特征干扰,在特征融合阶段实现多尺度语义与细节信息的高效互补,避免传统多感受野卷积的冗余计算

Limiiiing的博客 159

关于计算点到线段的距离

已知线段AB,求某点到该线段的距离。有三种情况,如图:为了简单我们归结为两种情况即垂足在AB上、垂足不在AB上。其实有五种,还有就是垂足与A或B共点,这两种情形可以等同为垂足在AB上。 当垂足在线段上时(包括垂足与A或B共点) 以A为起点B为终点构建向量u,以A为起点C为终点构建向量v 由向量叉积的定义容易得出:以向量u为底、向量v为侧边的平行四边形的面积。则 翻译成程序员的大白话就是三角形abc的面积=abs((Bx-Ax)*(Cy-Ay)-(By-Ay)*(Cx-Ax))/2 那么点到线.

a563501734的博客 3586

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250

opencv(c++)点到线段(非直线)的距离求解

@TOC 使用背景  笔者在求解点和直线匹配问题中遇到了,无法使用点到直线距离的情况.  直线的和线段的本质区别就在与直线是无限延伸的,所以你的点总可以找到一个垂足做出距离,但是对于线段来说是当线在直线外时会存在三种情况,接下来一次介绍. 原理简介  由图简单可知一共三种情况,第一种距离为点到直线的距离,后面两种分别是AP和BP和长度,使用向量知识的知识可以进行具体的推导,这里不再细说,有兴趣的...

卫少东个人博客 2057

python爬虫:采集求职者简历信息并进行人才分析

通过 Python 爬虫抓取求职者简历信息并进行人才分析,可以帮助企业快速筛选和匹配人才。但在实施过程中,必须严格遵守法律法规,确保数据来源合法合规。如果需要更复杂的分析,可以结合自然语言处理(NLP)和机器学习技术,进一步挖掘数据价值。

数据知道的博客 1万+

BlockUI专栏目录

BlockUI是一个设计NX对话框的工具,是官方推荐使用的对话框制作方法,能够与NX自身风格相统一,并且在实际开发中经常被使用。BlockUI可以帮助用户快速创建NX对话框,支持多种控件类型,如按钮、文本框、标签等。通过使用BlockUI,用户可以轻松地自定义对话框的布局、样式和交互行为。此外,BlockUI还提供了一些高级功能,如动态更新、条件显示和事件处理等,以帮助用户创建更加复杂和灵活的对话框。本专栏讲述了使用BlockUI制作NX对话框的方法,介绍了每个控件的功能,并且分享一些常用操作的源码。

王牌飞行员_里海的博客 1634

点到线段的距离

一、前言 点到直线的距离很简单,直接套用公式计算就行; 点到线段的距离要分情况讨论: 1、点的投射在线段上,等效于点到直线; 2、点的投射在线段外,点到线段的距离为该点到线段最近端点的距离; 3、点在线段上,距离为0; 二、详细代码 #ifndef DOT_LINE_DIS_H #define DOT_LINE_DIS_H #include <QObject> #include <qmath.h> #include <QPointF> const double

贝勒里恩的博客 3455

智能解译城市进程:遥感影像建筑物提取研究全景与前沿进展(数据集及代码)

随着全球城市化进程的加速,高效、精准地监测城市建筑物分布对城市规划、灾害评估、人口估算及智慧城市建设具有重要意义。传统的人工测绘方法耗时费力,难以满足大范围、动态更新的需求。而遥感影像建筑物提取技术,借助深度学习与计算机视觉,能够自动化识别并提取建筑物轮廓,极大地提升了城市信息获取的效率和精度。首先,建筑物提取是遥感影像解译的核心任务之一。

hanfeng5268的博客 591

点到线段的距离(向量)

一,很自然的想法就是判断点和线段的位置关系已经点的垂点是否在线段上,然后每种情况分别计算。 这种做法显然可行,只是觉得比较繁琐,想要更简单一点的计算方式; 二, 向量做法, 推荐看这篇博客https://blog.youkuaiyun.com/angelazy/article/details/38489293 我觉说得挺好的,看了很容易理解 我自己写的代码 ...

PL博客 4997

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++:点到线段的平面距离。点与点的平面距离。

LPoint是自己定义的点 //点(p0)  到线段(p1,p2)的距离 double GroundFilter::xj2DistancePointAndLine( LPoint p0, LPoint p1, LPoint p2 ) {     double dis12 = xj2DistancePointAndPoint(p1, p2);//线段长度     double dis01 = xj...

2287

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

点到线段的距离 计算几何

点到线段的距离有两种可能,如果点与线段的垂直线与线段所在直线的交点在线段上,所求的距离就是点到线段的距离 如果是在射线上,就是点到射线一端的距离...

傻子是小傲娇的博客(大钊) 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

点到线段的最短距离

点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别,即求点到线段最短距离时需要考虑参考点在沿线段方向的投影点是否在线段上,若在线段上才可采用点到直线距离公式,如图1所示。 图1 (a)最短距离为点P与其在线段AB上投影C之间的线段PC (b)最短距离为点P与端点B(或A)所构成的线段PB

long-long-ago 4712

点到线段的最小距离(C++)

/*********************************/ // 如果经过点做直线的垂足,垂足落在线段上,则取垂线段的距离 // 否则取到线段两端点距离的最小值 // // 参数: // point: 存储点的xy坐标 // p1, p2: 线段的两点 // // return: 点到线段的最小距离 /********************************

幻夢之葉 4745

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

确定点和四边形的坐标:设点为 ( P = (x0, y0) ),四边形的顶点为 (A = (x1, y1)),(B = (x2, y2)),(C = (x3, y3)) 和 (D = (x4, y4))。通过检查 ( t ) 的值,我们可以确定点 ( P ) 的投影位置是否在线段 ( AB ) 上,从而计算出点到线段的最短距离。因此,无论是逆时针顺序还是顺时针顺序,只要四边形的顶点按照顺序连接形成四边形的边界,计算点到四边形的最短距离的方法都是相同的。C++ 判断点是否在旋转矩形内部。

manyuan4374的博客 667

计算机图形学:计算点与线段的距离、投影和位置关系

这个方法基于右手定则,即如果你的右手的拇指指向 $\vec{AB} $ 的方向,而食指指向 $\vec{AP} $ 的方向,那么你的中指将指向叉积的方向。在计算机图形学、几何计算和物理模拟等领域,经常需要计算一个点到线段的距离、投影和位置关系。这些计算可以帮助我们确定点是否在线段上、点到线段的最短距离、以及点相对于线段的位置等信息。通过上述的理论推导和代码实现,我们可以有效地计算点到线段的距离、投影和位置关系。点P到线段AB的投影点P’可以通过向量投影的方法计算。

jianmo的博客 2305
上一篇: 表演 题解(C++)
下一篇: 字符串常用处理函数(C++)
Draba_Chen
博客等级 码龄8年 134粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值