判断两条线段是否相交

news2024/11/27 21:41:41

参考链接:
1
2

一、判断线段是否相交需要下面两步:

(1)快速排斥实验
(2)跨立实验

二、第一步快速排斥实验

在这里插入图片描述
对上图两条L1,L2线段来说,L1 x的最大值为d端点x=5,L2 x的最小值为a端点x=6,这就说明这两条线段肯定没有相交。
其他情况类似,代码表示如下:

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)

如果上面的四条判断有一个为真,则代表两条线段不相交;否则进行第二步判断。

三、第二步跨立实验

1、向量叉乘的几何意义

(1)二维向量叉乘公式
二维向量叉乘公式a(x1,y1),b(x2,y2),则a×b=(x1y2-x2y1),不需要证明的就是定义的运算。三维叉乘是行列式运算,也是叉积的定义,你把第三维看做0代入就行了。
在这里插入图片描述
(2)叉积与线段方向关系
两个坐标A(x1,y1),B(x2,y2),那么AxB的向量积就是x1y2-y1x2。
我们假定一个向量积R,R=x1y2-y1x2。
R<0 说明A在B的逆时针方向。
R=0 说明A与B共线,可能正向也可能反向。
R>0 说明A在B的顺时针方向。

2、举例说明

证明两条线段相交就要证明两条线段相互跨立,如果两条线段相交,那么一条线段两边的两个点要位于另一条线段的两边。
在这里插入图片描述
相交的情况下,我们从a点出发,分别沿ac,ad方向,得到两个向量,可以得到R>0;
在这里插入图片描述
不相交的情况下,我们从c点出发,分别沿ca,cb方向,得到两个向量,可以得到R<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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RobotFramework环境安装和入门

环境安装1、安装python建议版本3.7&#xff0c;Robot Framework不支持python最新版。 可以通过以下地址下载https://www.python.org/ftp/python/3.7.3/python-3.7.3-amd64.exe安装过程中选择添加到环境变量。2、安装Robot Framework以及所需组件注意各个组件的版本号&#xff0…

LVGL学习笔记15 - 文本框TextArea

目录 1. Parts 2. 样式 2.1 修改背景bg 2.2 修改边界border 2.3 修改文本 2.3.1 lv_textarea_add_char 2.3.2 lv_textarea_add_text 2.3.3 lv_textarea_set_text 2.3.4 设定可输入的字符 2.3.5 删除字符 2.3.6 设定字符串最大长度 2.4 滚动条 2.4.1 滚动方向 2.4.2 …

RHCE学习笔记-133-1

RH133-01 installation 光盘引导后,在提示符下输入:linux askmethod 可以支持:local cdrom,hard drive,nfs image,ftp,http方式 cpu on x86 2个物理超线程CPU 使用smp or hugemem kernel可以支持 32个物理cpus 内存 标准x86 kernel 4G smp i686/athlon kernel 16G hugemem SMP …

创建新分支,基于某一分支创建新分支,git push --set-upstream origin

背景&#xff1a; 基于hcc1.2的开发分支拉去hcc_hotfix_1.2.0分支&#xff0c;解读&#xff1a;在仓库中基于某个分支&#xff0c;创建一个新的分支 做法&#xff08;解决&#xff09;&#xff1a; 1、第一步&#xff1a;git branch hcc_hotfix_1.2.0 2、第二步&#xff1a;g…

葡萄城邀您参与「表格技术开发者新年分享会」,共话表格技术新未来!

数据资产是企业最重要的资产之一&#xff0c;表格也是企业最普遍的数据整理手段。在数字经济时代&#xff0c;各行业飞速发展&#xff0c;拥抱数字化、进行数字化升级已成为大势所趋&#xff0c;企业对协同办公、大数据分析、表格智能化应用等领域的需求也呈爆发式增长&#xf…

GrapeCity Documents Image Viewer JavaScript Crack

GrapeCity Documents Image Viewer 是跨平台 JavaScript 图像查看器 允许用户使用我们的 JavaScript 图像查看器在您的 Web 应用程序中查看和编辑图像。采集 by Ω578867473 支持多种图像格式 适用于所有现代浏览器和框架&#xff0c;包括 Edge、Chrome、Firefox、Opera、Saf…

【UE4 第一人称射击游戏】33-创建一个小地图

上一篇&#xff1a;【UE4 第一人称射击游戏】32-添加击杀AI的提示功能&#xff08;使用到控件蓝图的动画功能&#xff09;本篇效果&#xff1a;可以看到左上角完成了小地图的制作步骤&#xff1a;打开名为“FPSHUD”的控件蓝图&#xff0c;拖入一个图像控件&#xff0c;表示迷你…

Diffusion 和Stable Diffusion的数学和工作原理详细解释

扩散模型的兴起可以被视为人工智能生成艺术领域最近取得突破的主要因素。而稳定扩散模型的发展使得我们可以通过一个文本提示轻松地创建美妙的艺术插图。所以在本文中&#xff0c;我将解释它们是如何工作的。 扩散模型 Diffusion 扩散模型的训练可以分为两部分: 正向扩散→在图…

输出全排列(C++版)

目录 输出全排列 一、问题描述 二、运行环境说明 ​三、代码段 四、效果展示 输出全排列 备注&#xff1a;大二&#xff08;上&#xff09;数据结构课程设计A题 一、问题描述 请编…

我是如何利用cps平台赚钱的?

你好&#xff0c;我是你们熟悉而又陌生的好朋友梦龙&#xff0c;一个创业期的年轻人 今天跟你做个分享&#xff0c;众所周知互联网是一块非常大的蛋糕&#xff0c;几位互联网巨头也做不到完全吃透&#xff0c;这次梦龙给你分享的是实际的经验&#xff0c;实际的案例分享。 最开…

Spring存储和读取对象 -- 2

Spring存储和读取对象 -- 2前言一、存储 Bean 对象1.1 前置工作&#xff1a;配置扫描路径 (重要)1.2 添加注解存储 Bean 对象1.2.1 五大类注解Bean 命名规则1.2.2 方法注解 BeanBean 命名规则与重命名二、获取 Bean 对象 (对象注入)2.1 属性注入优点分析缺点分析2.2 Setter 注入…

如何在Jetbrain Rider中使用EntityFrameWork (Core) 命令行,如添加迁移和更新数据库

在Visual Studio中&#xff0c;EntityFrameWork命令如Add-Migration和Update-Database通常在包管理器控制台中运行。这在Visual Studio中工作得很好&#xff0c;但不幸的是&#xff0c;它不是可移植的。这些命令是基于powershell的&#xff0c;并且包管理器控制台绑定了Visual …

开源的文档型数据库--MongoDB(安装)

1、简介 MongoDB 是一个开源的、文档数据库管理系统。它提供了高性能、高可扩展性和高可用性。 MongoDB 使用了一种称为 BSON 的二进制形式的 JSON 来存储数据。这使得 MongoDB 可以轻松地存储各种数据类型&#xff0c;包括大型对象和二进制文件。 MongoDB 的一个重要特性是它的…

多线程1.

多线程1 1.如果想对地址空间的堆区做更细腻化的空间管理&#xff0c;怎么办&#xff1f; 搞一个vim_area_struct&#xff0c;他是一个双向链表。每一个节点是一块堆区空间&#xff0c;用链表串起来。 2.如何管理物理内存&#xff1f; 设定一个数据结构&#xff0c;如&#x…

电子会议桌牌

产品特色&#xff1a; 低功耗&#xff0c;常规使用3-5年电池寿命支持空中唤醒&#xff0c;刷新快速&#xff0c;几秒钟内看到结果点阵电子纸屏幕&#xff0c;视角接近180基于Web的应用界面&#xff0c;支持跨平台操作安装简单&#xff0c;快速布置电池供电不需要布线双面显示&…

神经网络模型的参数量和FlOPS

一、FLOPS、FLOPs和GFLOPs的概念 FLOPS&#xff1a;注意S是大写&#xff0c;是 “每秒所执行的浮点运算次数”&#xff08;floating-point operations per second&#xff09;的缩写。它常被用来估算电脑的执行效能&#xff0c;尤其是在使用到大量浮点运算的科学计算领域中。正…

重装系统把所有盘格式化教程

在使用电脑的过程中&#xff0c;可能会遇到系统重装的问题&#xff0c;但是有些朋友就觉得之前的分区不太合理&#xff0c;就打算全盘格式化重装系统&#xff0c;那小白一键重装系统怎么把所有盘格式化呢?这需要借助U盘或光盘来引导了。下面就来看看操作教程吧。 工具/原料&a…

2.17 STM32 SysTick—系统定时器

文章目录1、简介2、寄存器2.1 SysTick控制和状态寄存器(STK_CTRL)2.2 重载值寄存器&#xff08;STK_LOAD&#xff09;2.3 SysTick当前值寄存器 (STK_VAL)2.4 校准寄存器&#xff08;STK_CALIB&#xff09;3、SysTick 定时实验3.1 在标准库中3.2 在HAL库中的初始化4、SysTick 定…

driftingblues7靶机(eyes of network漏洞)

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;49by 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2021.1 信息收集 1.arp-scan -l 2.探测靶机开放端口和服务情况 nmap -p- -A -T4 192.168.1.108 漏洞利用 1.访…

为什么开发者这么看重SQL?看完这些应用场景你就明白了

看到一个有趣的比喻&#xff0c;用来说明SQL与Excel的差别是什么。 如果把SQL比作火车&#xff0c;把Excel更比作卡车。 卡车灵活自由&#xff0c;高速或乡村小道想去哪就去哪&#xff0c;但即便每天不停歇卡车的运载量也不大&#xff0c;而且容易出交通事故。 火车运载量大…