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

2023-11-14

背景

在做51nod上的第1951题时,需要根据给出的两条线段来判断这两条线段是否相交。所以在这里记录一下。

判断两条线段是否相交有两步:
①快速排斥计算
②跨立计算

快速排斥
给出线条AB、CD,如果以AB、CD为对角线的矩形不相交,那么AB、CD也必不可能相交;如果矩形相交,那么需要再通过跨立计算进行判断。对于矩形不相交,有下面两种情况:
在这里插入图片描述
对于上面两种情况,可以分成四类来讨论:
①AB两坐标中最大的x值 小于 CD两坐标中最小x值
②CD两坐标中最大的x值 小于 AB两坐标中最小x值
③AB两坐标中最大的y值 小于 CD两坐标中最小y值
④CD两坐标中最大的y值 小于 AB两坐标中最小y值

只要满足了以上四种的其中一种,就可以认为AB与CD不相交。

跨立计算

首先,这里需要用到向量叉乘的算法:其中ABCD是三维空间上的向量,与xOy平面平行。
在这里插入图片描述
其次,如下图。AB与CD相交必然有A、B在线段CD两边,C、D在线段AB两边。
根据上面的公式和右手螺旋法则,如果相交,AB X AC的z坐标值z1与AB X AD的z坐标值z2必然异号;同样的,DC X DA的z坐标值z3与DC X DB的z坐标值z4也必然异号。
特别的,如果B在CD上时,求得的z坐标值是0。所以只要同时满足z1 X z2 ≤ 0,z3 X z4 ≤ 0,就能保证必然相交
在这里插入图片描述

参考代码(C++)

class line{
public:
	int xa;
	int ya;
	int xb;
	int yb;
	line(){}
	line(int xa, int ya, int xb, int yb){
		this->xa = xa;
		this->ya = ya;
		this->xb = xb;
		this->yb = yb;
	}
	int get_max_x(){
		return xa > xb ? xa : xb;
	}
	int get_min_x(){
		return xa > xb ? xb : xa;
	}
	int get_max_y(){
		return ya > yb ? ya : yb;
	}
	int get_min_y(){
		return ya > yb ? yb : ya;
	}
};

bool is_intersect(line myline1, line myline2){
	if(myline1.get_max_x() < myline2.get_min_x() || 
	   myline2.get_max_x() < myline1.get_min_x() ||
	   myline1.get_max_y() < myline2.get_min_y() || 
	   myline2.get_max_y() < myline1.get_min_y())   return false;
	int res1 = (myline1.xa - myline1.xb) * (myline2.ya - myline1.yb) - (myline1.ya - myline1.yb) * (myline2.xa - myline1.xb);
	int res2 = (myline1.xa - myline1.xb) * (myline2.yb - myline1.yb) - (myline1.ya - myline1.yb) * (myline2.xb - myline1.xb);
	
	int res3 = (myline2.xa - myline2.xb) * (myline1.ya - myline2.yb) - (myline2.ya - myline2.yb) * (myline1.xa - myline2.xb);
	int res4 = (myline2.xa - myline2.xb) * (myline1.yb - myline2.yb) - (myline2.ya - myline2.yb) * (myline1.xb - myline2.xb);
	if(res1 * res2 <= 0 && res3 * res4 <= 0) return true;
	else return false;
}

参考文章:
两条线段相交判断学习理解
判断两条线段是否相交—(向量叉乘)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断两条线段是否相交(C++) 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • python开发平台PyCharm最好的一种编辑环境配置(字体大小和颜色)

    python 的开发平台PyCharm是一款非常人性化的IDE 得到非常多pythone开发者的认可和使用 下面分享一款个人非常喜爱的使用环境配置 如图所示 当然 你也可以有自己喜欢的个人设置 下面介绍一下总体的配置方法和本人使用的环境配置
  • 第15讲,添加门窗

    从内容浏览器中 可以找到门窗 但是brushtype选项已经没了
  • C# 关闭当前窗体打开另一窗体?

    你可以先打开form2 再关闭form1 button1 Click form2 frm2 new form2 frm2 show this close
  • fdisk 更改分区容量遇到问题,还以为是oracle asm的问题

    Command m for help wThe partition table has been altered Calling ioctl to re read partition table WARNING Re reading the
  • HBase数据的读写流程

    1 HBase数据写入流程 1 客户端访问Zookeeeper 从Meta表中得到写入数据对应的Region信息和相应的Region服务器 2 客户端访问相应的Region服务器 把数据分别写入HLog和MemStore MemStore数
  • tomcat配置参数

    1 内存参数调优 说明 tomcat初始堆内存8G 最大堆内存16G 新生代内存为最大堆内存的3 8 这里是6G 持久化内存默认82M 项目中使用月100M 必须重设 可以考虑256M或者更多 这个设置的2G 最大设置的是4G 存活比率默认
  • element 时间选择器时间跨度设置 7天

  • 国内工业数字化进程的推进,难点在哪里?

    推进工业数字化进程 通常称为工业 4 0 或工业物联网 IIoT 可能是一项复杂且具有挑战性的工作 在此过程中 经常会遇到一些困难和障碍 包括 1 遗留系统 许多工业设施仍然依赖于未考虑数字化设计的遗留设备和系统 将这些旧系统与现代数字技术
  • Java bean 详解

    JavaBean 介绍 功能特点 分类 组成 属性 方法 事件 event 范围 scope 页面page 请求request 对话session 应用application 任务 设计目标 1 紧凑而方便的创建和使用 2 完全的可移植性
  • Selenium分布式自动化测试平台 Standalone Server 4.0 搭建

    最新的selenium测试平台大概有这么几个组件 Selenium Standalone Server 用来搭建远程测试平台以及分布式测试 Selenium WebDriver 最基础的用来创建测试脚本以及用来和上面的server进行交互的
  • CSP 202305-3 解压缩

    这道T3主要是能够读懂题目 然后根据题意进行模拟 需要比较多的位运算 在此题 我选择用uint8 t存储一个字节 然后对字符和数字进行了转换 include
  • Java多线程-锁的概念

    1 结婚戒指的意义 根据文献记载 最早使用戒指人就是希腊的悲剧英雄 被缚的普罗米修斯 宙斯为惩罚普罗米修斯盗火给人类 将他绑缚在考卡苏斯山上 每天都有一只老鹰飞到山上 将他的内脏啄出 到了夜晚 他所失去的器官又会重新长出来 后来 大力士海格
  • Kubernetes 中部署 NFS Provisioner 为 NFS 提供动态分配卷

    Kubernetes 中部署 NFS Provisioner 为 NFS 提供动态分配卷 文章目录 Kubernetes 中部署 NFS Provisioner 为 NFS 提供动态分配卷 一 NFS Provisioner 简介 二 创建
  • bert-as-service配置

    环境配置 conda create n bert service python 3 8 conda activate bert service pip install user nvidia pyindex pip install user
  • 11.Java数据库连接

    Java数据库连接 概念 在软件开发中 经常需要与数据库进行交互来存储和检索数据 Java提供了一种称为JDBC Java Database Connectivity 的API 用于连接和操作各种类型的关系型数据库 数据库连接是指通过Jav
  • 卷积与傅立叶变换

    一 卷积 1 一维的卷积 连续 在泛函分析中 卷积是通过两个函数 f x f x f x 和 g x g x g x 生成第三个函数的一种算子 它代表的意义是 两个函数中的一个 我取 g x
  • 私人网站域名服务器公安备案指南【网站备案】

    今天收到了工信部的审核通过短信 你的服务器要想使用域名解析 其中一个要求就是服务器要有备案 很开心 但 事情没那么简单 要求你30天内进行公安备案 我打开谷歌网址 开始了我的坎坷备案之旅 一天下午 加一天晚上 第二天下午
  • vue —— 路由 replace

    作用 控制路由跳转时操作浏览器历史记录的模式 2 浏览器的历史记录有两种方式 分别为 push 和 replace push是追加历史记录 replace是替换当前记录 路由跳转的时候默认 push 3 开启replace模式
  • CPU使用率和负载Load计算方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Loadavg分析 Loadavg浅述 cat proc loadavg 可以看到当前系统的load cat proc loadavg 0 01 0 02 0 05 2 3
  • 判断两条线段是否相交(C++)

    背景 在做51nod上的第1951题时 需要根据给出的两条线段来判断这两条线段是否相交 所以在这里记录一下 判断两条线段是否相交有两步 快速排斥计算 跨立计算 快速排斥 给出线条AB CD 如果以AB CD为对角线的矩形不相交 那么AB C