解析几何:计算两条线段的交点

news2025/1/11 5:44:26

大家好,我是前端西瓜哥。

今天来实现计算两条线段的交点的解析几何算法。

我们要实现 getLineSegIntersection 方法:提供两条线段,计算它们的交点。

每条线段会用两个点坐标表示。

const getLineSegIntersection = (p1, p2, p3, p4) => {
  // 待实现
}

// 测试用例
getLineSegIntersection(
  { x: 1, y: 1 }, { x: 4, y: 4 },
  { x: 1, y: 4 }, { x: 4, y: 1 }
);
// 期望 { x: 2.5, y: 2.5 }

思路

思路很简单,就是解两条直线对应的一个二元一次方程组,求出 x 和 y

如果无解或多解,说明直线平行,交点不存在。

如果有解,可拿到唯一交点,但也只能说明直线有交点,还需要判断线段是否有交点。

所以我们需要判断交点是否在线段的区间上。如果是,说明两线段有交点,返回交点。

克拉姆法则

解方程组需要用到 克拉姆法则

对于:

可转换为矩阵形式表示:

然后计算主矩阵(最左边的矩阵)的行列式,对角相乘然后相减:

如果行列式为 0,说明没有唯一解;

如果不为 0,则有唯一解:

回到我们的两条直线,我们用两点式表示直线:

转换成 Ax+By=C 的格式,得到:

image-20231012020643096

于是:

const a = y2 - y1;
const b = x1 - x2;
const c = x1 * y2 - x2 * y1;

第二条线段同理:

const d = y4 - y3;
const e = x3 - x4;
const f = x3 * y4 - x4 * y3;

算法实现

interface Point {
  x: number;
  y: number;
}

const getLineSegIntersection = (
  p1: Point,
  p2: Point,
  p3: Point,
  p4: Point
): Point | null => {
  const { x: x1, y: y1 } = p1;
  const { x: x2, y: y2 } = p2;
  const { x: x3, y: y3 } = p3;
  const { x: x4, y: y4 } = p4;

  const a = y2 - y1;
  const b = x1 - x2;
  const c = x1 * y2 - x2 * y1;

  const d = y4 - y3;
  const e = x3 - x4;
  const f = x3 * y4 - x4 * y3;

  // 计算分母
  const denominator = a * e - b * d;

  // 判断分母是否为 0(代表平行)
  if (Math.abs(denominator) < 0.000000001) {
    // 这里有个特殊的重叠但只有一个交点的情况,可以考虑处理一下
    return null;
  }

  const px = (c * e - f * b) / denominator;
  const py = (a * f - c * d) / denominator;

  // 判断交点是否在两个线段上
  if (
    px >= Math.min(x1, x2) &&
    px <= Math.max(x1, x2) &&
    py >= Math.min(y1, y2) &&
    py <= Math.max(y1, y2) &&
    px >= Math.min(x3, x4) &&
    px <= Math.max(x3, x4) &&
    py >= Math.min(y3, y4) &&
    py <= Math.max(y3, y4)
  ) {
    return { x: px, y: py };
  }

  return null;
};

变体

这个算法可以做一些变体,实现其他的算法。

变体1:两线段是否有交点

返回值换成布尔值即可。

判断两线段是否有交点,我之前还写了另一种解法,感兴趣可以看看:

《几何算法:判断两条线段是否相交》

变体2:计算两直线的交点

把判断直线交点是否在线段上的逻辑去掉,然后直接返回点坐标即可。

优化点

1、重叠但却只有一个交点的情况

如果线段平行,有两种情况:

  1. 没有重叠(0 个解)
  2. 有部分重叠(多解)

如果部分重叠,可能有多个点,多个点的情况下也不知道拿哪个点作为交点好,这种情况下还是返回 null。

但有一个特殊的情况:重叠只有一个点(比如线段 a 的末点刚好是线段 b 的起点)。如果你的场景下判断比较严格,你可以选择返回这个点。要实现这部分也是有点点复杂的。

2、误差处理。线段的两个端点的距离非常小,计算出的结果也会非常小,可能会进入了 0 的绝对误差范围了,考虑改成相对误差。

3、溢出风险。数值很大时有溢出风险,可以考虑计算一个缩放值,缩小后计算,计算完再放大回去。

结尾

总结一下,求两线段的交点,本质就是解方程,需要用到克莱姆法则,计算出来的交点是直线交点,不一定是线段交点,需要在判断点是否在线段范围内。

不复杂,就是有一点点小细节。

我是前端西瓜哥,欢迎关注我,学习更多解析几何知识。

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

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

相关文章

多媒体应用设计师 第3章 多媒体信息传输技术

1.数据通信技术 1.1.多媒体通信的服务质量 多媒体服务质量(Qos)指网络服务的良好程度&#xff0c; 衡量QoS的常见指标为:吞吐量&#xff0c;差错率&#xff0c;端到端延迟&#xff0c;延迟抖动,带宽&#xff0c;丢包率&#xff0c;服务可用性等。 1.2.多媒体通信的服务质量类…

MDK Keil开发时出现问题汇总与解决办法--实战成功解决

文章目录 问题1&#xff1a;Error :Flash Download failed "Cortex-M4" 出现无法烧录问题点击烧录时出现下述图片&#xff1a;问题分析&#xff1a;发现没有添加编程算法描述&#xff1a;正确的情况是下面的点击Add按钮&#xff0c;选择主Flash添加&#xff1a;编译后…

windows每天定时重启 Win11 Win10定时重启 windows定时重启系统 windows每天定时重启

windows每天定时重启 Win11 Win10定时重启 windows定时重启系统 windows每天定时重启 使用 Windows 的任务计划程序来设置每天自动重启计算机1. 打开 任务计划程序&#xff1a;2. 在 任务计划程序库 面板中&#xff0c;创建一个基本任务3、设置计划任务权限 使用 Windows 的任务…

你真的了解微服务架构吗?

目录 写在前面 从单体架构说起 聊到分布式架构 聊回到微服务架构 微服务架构的关键技术 写在前面 随着互联网行业的快速发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构早就从原来单体架构逐渐演变为现在流行的微服务架构。 微服务&#xff08;Micros…

代码随想录算法训练营第二十四天丨 回溯算法part02

216.组合总和III 思路 本题就是在 [1,2,3,4,5,6,7,8,9] 这个集合中找到和为n的k个数的组合。 相对于77. 组合 (opens new window)&#xff0c;无非就是多了一个限制&#xff0c;本题是要找到和为n的k个数的组合&#xff0c;而整个集合已经是固定的了[1,...,9]。 本题k相当于…

目标跟踪数据集分享

360VOT: A New Benchmark Dataset for Omnidirectional Visual Object Tracking 360VOT 是一个新的大规模全景追踪基准数据集&#xff0c;旨在为全景视觉物体追踪提供支持。这个数据集包含了 120 个序列&#xff0c;总计超过 11.3 万张高分辨率帧&#xff0c;采用等距投影。追踪…

ImgPlus:基于CodeFormer的图片增强

背景 最近参与了华为云开发者大会AI赛道&#xff0c;做了一个AI图片增强作品&#xff0c;本片文章来简单介绍一下。 正文 作品名称&#xff1a;ImgPlus 赛题技术领域选择&#xff1a; AI&#xff0c;图片增强 使用技术名称&#xff1a; CodeFormer&#xff0c;ECS&#xff0…

NoVNC(Client)+TigerVNC(Server)搭建流程

1.NoVNC(Client)的搭建 1.1.下载 下载链接 https://github.com/novnc/noVNC/releases/tag/v1.4.0 1.2 解压 将解压后的文件放置在web应用的静态资源下 1.3 设置 -通过访问web项目静态资源的方式访问vnc.html -配置server端的访问websockify代理的ip和端口号。 -连接到服务…

Flink 的集群资源管理

集群资源管理 一、ResourceManager 概述 1、ResourceManager 作为统一的集群资源管理器&#xff0c;用于管理整个集群的计算资源&#xff0c;包括 CPU资源、内存资源等。 2、ResourceManager 负责向集群资源管理器申请容器资源启动TaskManager实例&#xff0c;并对TaskManag…

Modbus协议中浮点数的格式与换算

Modbus协议中浮点数&#xff08;单精度&#xff09;使用的是IEEE754标准浮点数(32位)的表示方法&#xff1a; IEEE754浮点数二进制格式示意图 1[31] 符号位(SIGN)8[23-30] 指数位(EXPONENT) 指数偏移量 12723[0-22] 尾数位(MANTISSA) 转换为10进制的公式&#xff1a; SGL (…

音视频技术开发周刊 | 315

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 OpenAI科学家最新演讲&#xff1a;GPT-4即将超越拐点&#xff0c;1000倍性能必定涌现&#xff01; GPT-4参数规模扩大1000倍&#xff0c;如何实现&#xff1f;OpenAI科学家…

数据结构复盘——第三章:栈和队列

文章目录 第一部分&#xff1a;栈1、栈的定义2、栈的操作 第一部分习题第二部分&#xff1a;共享栈1、共享栈的定义2、共享栈的操作 第二部分习题第三部分&#xff1a;链栈1、链栈的定义2、链栈的操作 第三部分习题第一到三部分小结1、顺序栈和链栈的比较2、栈的应用3、栈的应用…

正向代理流程

正向代理场景 已经拿下了一台服务器&#xff0c;该服务器有两个网卡&#xff0c;一个公网&#xff0c;一个私网未被攻击的服务器只有一个内网网卡&#xff0c;它不能和其他网段通信&#xff0c;只能在本网段通信&#xff0c;被叫做不出网主机攻击机需要直接连接未被攻击的服务器…

Shopee印尼站停止销售跨境商品:电商新规是否将改变印尼电商格局?

在全球电商市场竞争激烈的背景下&#xff0c;东南亚地区的印尼一直以其庞大的人口和不断增长的中产阶级而闻名。这个国家拥有着无限的潜力&#xff0c;吸引着各大电商平台争相进军。 然而&#xff0c;近期&#xff0c;一项关于电子商务的新法规引发了广泛的讨论和关注。据报道…

竞赛选题 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

C++ 快速排序算法

1、快速排序 步骤&#xff1a; 确定分界点 通常选 Q[L]、Q[(LR)/2]、Q[R]调整范围 使左边的 <X 右边 > X 也就是 左右两边的指针&#xff0c;依次比较定义的分界点&#xff08;X&#xff09;根据比较大小调整顺序 依次递归处理左右两端 模板代码&#xff1a; // 数组…

ExoPlayer架构详解与源码分析(5)——MediaSource

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

计算机毕业设计--基于SSM+Vue的物流管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Postman接口测试: postman设置接口关联,实现参数化

postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用postman获取上一个接口指定的返回值…

ICMP协议(一)

一 ICMP 说明&#xff1a; 了解大致内容即可,如果不是搞数通的只需要有个概念即可 小林 coding ① 概念 重点&#xff1a; ping、traceroute、mtr 主要是利用 ICMP 或者 UDP 的特性特点&#xff1a; ICMP 是TCP/IP协议簇的一个子协议,属于网络层 [三层]协议作用&#xff…