【C++笔记】如何判断2个线段相交

判断两条线段是否相交以及点是否在四边形内的C++算法 1.判断两条线段是否相交 #include <iostream> using namespace std; struct Point { double x, y; }; // 判断两条直线是否相交 double determinant(double v1, double v2, double v3, double v4) // 行列式 { return (v1*v4 -... 阅读详情
AI摘要

本文介绍了两种判断线段是否相交的方法:直接计算交点和利用向量叉积。重点讲解了基于向量叉积的算法,包括快速排斥实验和跨立实验,并提供了具体的代码实现。

判断 2 个线段相交有很多方法,最直接的方法就是直接计算两条直线的交点,然后看看交点是否分别在这两条线段上。这样的方法很容易理解,但是代码实现比较麻烦。

还有一种常用的方法是通过向量叉积来判断的,这种方法不需要算出直线方程,在代码实现上比较简便。 
用这种方法判别线段是否相交一般分为两步: 
1. 快速排斥实验 
2. 跨立实验

快速排斥实验

我们首先判断两条线段在 x 以及 y 坐标的投影是否有重合。 
也就是判断下一个线段中 x 较大的端点是否小于另一个线段中 x 较小的段点,若是,则说明两个线段必然没有交点,同理判断下 y。

这里写图片描述 
如上图所示,代码表示如下:

max(C.x,D.x)<min(A.x,B.x) || max(C.y,D.y)<min(A.y,B.y) ||
max(A.x,B.x)<min(C.x,D.x) || max(A.y,B.y)<min(C.y,C.y)

如果上面的四条判断有一个为真,则代表两线段必不可交,否则应该进行第二步判断。 
显然,上图通不过快速排斥实验。

跨立实验

矢量叉积

计算矢量叉积是与直线和线段相关算法的核心部分。 
设矢量 P = (x1, y1),Q = ( x2, y2 ),则矢量叉积定义为:P × Q = x1*y2 - x2*y1,其结果是一个矢量,与为 P Q 向量所在平面的法向量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。 
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系: 
  若 P × Q > 0 , 则 P 在 Q 的顺时针方向。 
  若 P × Q < 0 , 则 P 在 Q 的逆时针方向。 
  若 P × Q = 0 , 则 P 与 Q 共线,但可能同向也可能反向。

通过叉积来判断线段相交

这里写图片描述 
如果两线段相交那么就意味着它们互相跨立,即如上图点 A 和 B 分别在线段 CD 两侧,点 C 和 D 分别在线 AB 两侧。 
判断 A 点与 B 点是否在线段 DC 的两侧,即向量 A-D 与向量 B-D 分别在向量 C-D 的两端,也就是其叉积是异号的,即 (A−D)×(C−D)∗(B−D)×(C−D)<0(A−D)×(C−D)∗(B−D)×(C−D)<0。 
同时也要证明 C 点与 D 点在线段 AB 的两端,两个同时满足,则表示线段相交。

然后我们来看看临界情况,也就是上式恰好等于 0 的情况下:

这里写图片描述

当出现如上图所示的情况的时候,(A−D)×(C−D)∗(B−D)×(C−D)=0(A−D)×(C−D)∗(B−D)×(C−D)=0,显然,这种情况是相交的。只要将等号直接补上即可。

再接得想一想,如果没有第一步的快速排斥实验,仅判断第二步,会出现什么问题?

这里写图片描述

当出现如上所示的情况的时候,叉积都为 0, 可以通过跨立实验,但是两个线段并没有交点。不过还好,这种情况在第一步快速排斥已经被排除了。

代码

struct Line {
    double x1;
    double y1;
    double x2;
    double y2;
};

bool intersection(const Line &l1, const Line &l2)
{
    //快速排斥实验
    if ((l1.x1 > l1.x2 ? l1.x1 : l1.x2) < (l2.x1 < l2.x2 ? l2.x1 : l2.x2) ||
        (l1.y1 > l1.y2 ? l1.y1 : l1.y2) < (l2.y1 < l2.y2 ? l2.y1 : l2.y2) ||
        (l2.x1 > l2.x2 ? l2.x1 : l2.x2) < (l1.x1 < l1.x2 ? l1.x1 : l1.x2) ||
        (l2.y1 > l2.y2 ? l2.y1 : l2.y2) < (l1.y1 < l1.y2 ? l1.y1 : l1.y2))
    {
        return false;
    }
    //跨立实验
    if ((((l1.x1 - l2.x1)*(l2.y2 - l2.y1) - (l1.y1 - l2.y1)*(l2.x2 - l2.x1))*
        ((l1.x2 - l2.x1)*(l2.y2 - l2.y1) - (l1.y2 - l2.y1)*(l2.x2 - l2.x1))) > 0 ||
        (((l2.x1 - l1.x1)*(l1.y2 - l1.y1) - (l2.y1 - l1.y1)*(l1.x2 - l1.x1))*
        ((l2.x2 - l1.x1)*(l1.y2 - l1.y1) - (l2.y2 - l1.y1)*(l1.x2 - l1.x1))) > 0)
    {
        return false;
    }
    return true;
}

判断两条线段是否相交 计算几何 对于线段A,B,如果 线段A与直线B相交 ,线段B与直线A相交 ,那么就可以认为线段A 和线段B相交。 关键问题是:如何判断直线AB是否与线段CD相交呢? 设直线AB的方程为:f(x,y) = 0,直线方程可以通过两点式求得。 当C和D点不在直线的同侧时,直线AB必然与线段CD相交,也就是说直线AB与线段CD相交的条件为:f(C) * f(D) &lt;= 0。 代码如下: t... 阅读详情

相关推荐

C++线段求交:计算两条线段的交点

我们首先计算两条线段的斜率,并判断它们是否相等。接下来,我们计算两条线段的截距,并根据截距计算交点的x坐标。然后,我们检查交点的x坐标是否在两条线段的x范围内,如果不在范围内,则表示交点不在两条线段上,两条线段不相交。如果交点的x坐标在范围内,则表示两条线段相交。在计算机图形学和计算几何中,求解线段交点是一个常见的问题。我们将使用基本的几何算法和条件来确定线段是否相交,并计算出它们的交点。我们使用相同的方法来计算交点的x坐标,并通过斜率和截距计算交点的y坐标。函数中,我们定义了两组线段的端点坐标,并调用。

2301_79326891的博客 1740

【C++】判断两条“线段”是否相交

利用【C++】判断两条“线段”是否相交!附源码!

你的问题在于,读书太少而想得太多。 4878

用c++判断线段是否在多边行内?

通过上述方法,我们可以判断线段与多边形的关系,并根据不同的情况返回相应的结果。希望如上措施及解决方案能够帮到有需要的你。PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

**My Coding Family** 1254

51nod--1264 线段相交

1264线段相交 基准时间限制:1秒 空间限制:131072KB 分值:0难度:基础题 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。 Input 第1行:一个数T,表示输入的测试数量(1<=T<=1000...

weixin_30619101的博客 434

C++计算机和常用到的一些函数

ACM计算几何:求叉积,点积,两点间的距离,点是否在线段上,点到线段的距离,判断两条线段是否相交,线段与直线的位置关系等等

判断两直线是否相交 C++ MFC

用VC6.0实现的MFC单文档程序,用鼠标在屏幕上任意画两条直线,判断两直线是否相交。

判断两条线段是否相交(C++)

判断两线段是否相交(C++)

qq_41726230的博客 8780

【CMU-自主导航与规划】Autonomous Exploration Development Environment 实战:从环境搭建到多场景测试

本文详细介绍了CMU开源自主导航开发环境(Autonomous Exploration Development Environment)的实战部署与测试。内容涵盖从Ubuntu与ROS环境搭建、仿真场景配置,到核心导航模块(地形分析、局部避障、航点跟踪)的深度解析,并演示了如何集成TARE探索与FAR规划等上层算法,最终指导连接真实SLAM与实车部署,完成多场景性能评估。

weixin_29215391的博客 704

如何判断两条线段是否相交

本篇是在 【C++笔记】如何判断2个线段相交 的基础上加上自己的理解和实践总结出的判断两线段是否相交的方法。 判断两条线段是否相交 先附上判断函数 bool judge(int Ax1,int Ay1,int Ax2,int Ay2,int Bx1,int By1,int Bx2,int By2) { if( ( max(Ax1,Ax2)>=min(Bx1,Bx2)&...

NEFU_kadia的博客 1万+

基于单片机智能家居控制系统设计

*单片机设计介绍,基于单片机智能家居控制系统设计。

QQ2193276455的博客 1714

microblaze之Video Processing Subsystem调试误区

内容:总结video processing subsystem调试中遇到的问题,以及在解决问题中的思路方法论,引为前车之鉴。 1,我的目的是希望采用vps中的scaler模块对图像进行拉伸缩小。IP的配置如下: 2,整个系统的框架图如下,仅比上期的内容增加了scaler模块,如下: 3,查手册,可以知道这个scaler only组件分成了hscale,vscale和GPIO,其中GPIO是控制上下游stream流控设备复位用,暂时忽略。 hscale和vscale的寄存器空间如下,主要关注图

YDY5659150的专栏 3555

判断线段与圆是否相交

判断线段与圆是否相交 一、知识点 1、判断点是否在圆内的方法:设点到圆心的距离为d,圆的半径为r,那么有 d<r 在圆内 d=r 在圆上 d>r 在圆外 (其中d可由两点距离公式求出) 2、已知两点p1(x1,y1)、p2(x2,y2)...

逐梦者 1万+

基于ESP32-S3与模块化设计的立创桌面充电站:从硬件架构到Web控制实战

本文详细介绍了基于ESP32-S3与模块化设计的立创桌面充电站项目,涵盖从硬件架构到Web控制的全流程实战。项目采用模块化设计,支持自由组合快充模块,并通过ESP32-S3实现智能监控,用户可通过本地网页实时查看各接口电压、电流与功率数据。文章重点解析了基板、连接板与充电模块三大核心部件的设计,特别是大电流PCB的“开窗贴铜”处理技巧,并提供了固件刷写与Web控制面板的配置指南。

weixin_36122351的博客 292

计算几何学 | 判断线段相交 | Intersection | C/C++实现

问题描述 对于线段s1、s2,如果相交则输出“1”,否则输出“0”。 设s1的端点为p0、p1、,s2的端点为p2、p3。 输入: 第1行输入问题数q。接下来q行给出q个问题。各问题线段s1、s2的坐标按照以下格式给出: xp0x_{p0}xp0​ yp0y_{p0}yp0​ xp1x_{p1}xp1​ yp1y_{p1}yp1​ xp2x_{p2}xp2​ yp2y_{p2}yp2​ xp3x_...

qq_40998706的博客 3071

SAP ERP销售应收&成本科目确定

ERP作为业财一体软件,其中最核心的就是业务与财务模块的自动集成,无需财务进行手工做账,提高工作效率的同时降低人工操作产生的误差。今天浅浅的分享一下SD模块生成会计凭证时,借贷项确定的系统配置。一般项目上借贷项、科目都有FICO提供,但是具体的集成配置是在SD这边。

weixin_43657667的博客 1568

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 303

如何判断平面上两条线段(注意是线段)是否相交?

看到题目,很多人想,这个问题太简单了,直接求直线方程,然后求交点,看方程组是否有解。我在网上搜索了一下,很多思路都是求直线方程,求交点或求距离,不一而足。回顾高中学的线性规划知识,下面将给出一个我认为相对较好的算法,如果算法或程序有什么bug, 欢迎指正,谢谢。 已知线段AB,线段CD. 先来判断直线AB与线段CD是否相交,如果不相交,那么线段AB和线段CD肯定不相交。如果直线AB和线段CD已经相...

weixin_43731005的博客 2324

【目标检测】基于yolov5的铝型材表面缺陷检测(附代码和数据集,Ubuntu或者Linux系统均可运行)

【目标检测】基于yolov5的铝型材表面缺陷检测(附代码和数据集,Ubuntu或者Linux系统均可运行)

学无止境、积少成多、厚积薄发 2169

判断两条线段是否相交

判断两条直线是否相交有两步:                         1:快速排斥(可以筛除大部分)                         2:跨立试验(下面会有所说明) 现在开始解释:     第一步快速排斥,实际上就是先判断一下,假设现在有两条线段ab,cd,现在我们需要判断以ab为对角线的矩形是否和以cd为对角线的矩形是否有重合的部分,如果有则我们可以进行下一步判断

白黑菜的博客 3671

34、量子概率幅世界与相关操作解析

本文详细解析了量子概率幅的概念及其在量子力学中的核心作用,介绍了量子态的表示方法与叠加原理,讨论了幺正操作在量子演化中的重要性,并阐述了量子测量的基本原理与影响。此外,文章还分析了量子系统在量子计算中的应用,包括干涉在量子算法中的作用、量子门的组合使用以及量子测量的关键地位,总结了量子系统的独特特性与面临的挑战,展望了量子计算的未来发展趋势。

pytorch8learner的博客 175

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

平面中判断线段与矩形是否相交

简单介绍了平面中判断线段与矩形是否相交的算法。

Charlee44的技术驿站 4127

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

计算几何之判断线段相交

叉乘的应用,可以当成计算几何例题来看

OIER成长之路 1328

android 蓝牙通讯demo

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

线段相交判断

利用排斥实验和跨立实验,判断两条线段是否相交。

马鸣玉珂的专栏 1634

判断两个线段相交

我们首先将问题分成如下几个小问题讨论 首先要解决的第一个问题是判断直线是否平行 ,我们首先假设四个点的坐标为前两个点为a(x1, y1), b(x2, y2) 后两个点为 c(x3, y3), d(x4, y4),求出两个直线的方向向量e1→=(x1−x2,y1−y2)\vec{e1}=(x1 - x2, y1 - y2), e2→=(x3−x4,y3−y4)\vec{e2} = (x3 -

coordinate的博客 2140
上一篇: 【图像处理】Hough直线变换
下一篇: 【C++笔记】C/C++程序从编译到最终生成可执行文件的过程分析
HelloZEX
博客等级 码龄11年 486粉丝 264原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值