惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog
Y
Y Combinator Blog
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
博客园_首页
B
Blog RSS Feed
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
L
LangChain Blog
宝玉的分享
宝玉的分享

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
线段相交判断
Yiwei Zhang · 2024-08-06 · via 又见苍岚

本文记录判断线段是否相交的方法。

判断线段是否相交

判断线段是否共线

判断 AB 和 CD 向量叉乘是否为 0, 如果为 0 则平行,如果 AB 和 AC、 AD 叉乘也为 0 则共线。

随后查看线段是否重叠,分别查看 x, y 是否重叠即可判断。

在不共线情况下判断是否相交

此种情况下线段相交有两种情况

  1. A,B 两点分别在线段 CD 两侧,同时 C, D 两点分别在 AB 线段两侧

$$ \begin{array}{c} (\vec{AC}\times\vec{AB})\cdot(\vec{AD}\times\vec{AB})<0 \\ (\vec{CA}\times\vec{CD})\cdot(\vec{CB}\times\vec{CD})<0 \end{array} $$

  1. 第二种情况下由于端点在线段上,所以有一个叉乘为0,因此:

$$ \begin{array}{c} (\overrightarrow{AC}\times\overrightarrow{AB})\cdot(\overrightarrow{AD}\times\overrightarrow{AB})=0 \\(\overrightarrow{CA}\times\overrightarrow{CD})\cdot(\overrightarrow{CB}\times\overrightarrow{CD})=0 \end{array} $$

计算交点

假设交点为$P$,则有$P= A+ \overrightarrow {AB}* t$, $t\in [ 0, 1]$且$P= C+ \overrightarrow {CD}* u$, $u\in [ 0, 1]$ 即 $$ \begin{array}{c} A+ \overrightarrow {AB}* t= C+ \overrightarrow {CD}* u \\ \overrightarrow {AB}* t= \overrightarrow {AC}+ \overrightarrow {CD}* u \end{array} $$ 由于向量自身的叉乘为0,所以上式两边同时叉乘 $\overrightarrow {CD}$ 可得: $$ \vec{CD}\times\vec{AB}*t=\vec{CD}\times\vec{AC} $$ 变形可得: $$ t=\frac{\overrightarrow{CD}\times\overrightarrow{AC}}{\overrightarrow{CD}\times\overrightarrow{AB}},\:t\in[0,1] $$ 同理,两边同时叉乘$\overrightarrow{AB}$可得:$-\overrightarrow{AB}\times\overrightarrow{CD}*u=\overrightarrow{AB}\times\overrightarrow{AC}$ ,所以: $$ u=\frac{\overrightarrow{AB}\times\overrightarrow{AC}}{\overrightarrow{CD}\times\overrightarrow{AB}},\:u\in[0,1] $$

参考资料

文章链接:
https://www.zywvvd.com/notes/study/math/cross-segment/cross-segment/