首页 > 其他分享 >计算几何之两条线段的交点

计算几何之两条线段的交点

时间:2023-06-19 22:33:51浏览次数:52  
标签:frac overrightarrow 线段 交点 两条 几何 cases

1. 概述

可以通过线段的跨立实验[1]判断两条线段是否相交,但是想要进一步求它们的交点还是比较麻烦。[2]给出的方法更加简单,其原理来自求三维空间两条线段的交点[3]。为了更好的理解,本文将详细介绍二维空间两条线段的交点求解过程。

2. 两条线段交点求解过程

给定两条线段\(\overline{P_1 P_2}\)和\(\overline{P_3 P_4}\),端点表示为\(P_1(x_1,y_1)\)、\(P_2(x_2,y_2)\)、\(P_3(x_3,y_3)\)和\(P_4(x_4,y_4)\),两条线段对应的向量表示为\(\overrightarrow{P_1 P_2}\)和\(\overrightarrow{P_3 P_4}\)。假设两条线段的交点为\(P_0(x_0,y_0)\),且\(t=\frac{|\overline{P_1 P_0}|}{|\overline{P_1 P_2}|}\) 、\(s=\frac{|\overline{P_3 P_0}|}{|\overline{P_3 P_4}|}\),那么 \(P_0\) 可以表示为:

\[\begin{cases} P_0=P_1 + t * \overrightarrow{P_1 P_2} , 0\leq t \leq 1 \\ P_0=P_3 + s * \overrightarrow{P_3 P_4} , 0\leq s \leq 1 \end{cases} \]

\(t\)和\(s\)在等于\(0\)或\(1\)时表示两条线段相交在端点,如果为其他值,表示两条线段不相交。将点坐标代入公式得:

\[\begin{cases} x_1 + t * (x_2 - x_1) = x_3 + s * (x_4 - x_3) \\ y_1 + t * (y_2 - y_1) = y_3 + s * (y_4 - y_3) \end{cases} \]

利用公式消元法求得\(t\)和\(s\):

\[t = \frac{ (x_3 - x_1)(y_4 - y_3) - (y_3 - y_1)(x_4 - x_3) }{ (x_2 - x_1)(y_4 - y_3) - (y_2 - y_1)(x_4 - x_3) } \\ s = \frac{ (x_3 - x_1)(y_2 - y_1) - (y_3 - y_1)(x_2 - x_1) }{ (x_2 - x_1)(y_4 - y_3) - (y_2 - y_1)(x_4 - x_3)} \]

\(t\)和\(s\)方程的分子和分母都是向量的叉乘:

\[t = \frac{ \overrightarrow{P_3 P_1} * \overrightarrow{P_4 P_3} } { \overrightarrow{P_2 P_1} * \overrightarrow{P_4 P_3} } \\ s = \frac{ \overrightarrow{P_3 P_1} * \overrightarrow{P_2 P_1} }{ \overrightarrow{P_2 P_1} * \overrightarrow{P_4 P_3} } \]

如果\(\overrightarrow{P_2 P_1} * \overrightarrow{P_4 P_3} = 0\),表示两条线段平行,如果端点在另一条线段上,则该端点为交点,否则不是。如果\(t\)和\(s\)有一个没有落在区间\([0,1]\)内,则两条线段不相交。那么交点\(P_0\)的坐标为:

\[\begin{cases} x_0 = x_1 + t*(x_2 - x_1) \\ y_0 = y_1 + t*(y_2 - y_1) \end{cases} \]

\[\begin{cases} x_0 = x_3 + s*(x_4 - x_3) \\ y_0 = y_3 + s*(y_4 - y_3) \end{cases} \]

至此,整个求解过程介绍完成,再去看[2]的代码就非常容易理解了。

参考文献

  1. How to check if two given line segments intersect?

  2. Find the Intersection Point of Two Line Segments

  3. Intersections of Lines In Three-Space  - Jon Garvin

标签:frac,overrightarrow,线段,交点,两条,几何,cases
From: https://www.cnblogs.com/huntto/p/17492406.html

相关文章

  • 浅谈线段树
    线段树引入线段树是较为常用的数据结构,一般用于维护区间信息。线段树可以在\(O(\logn)\)的时间复杂度内实现单点修改,区间修改,区间查询等操作。一般的在区间上进行操作的题目都可以考虑线段树。普通线段树基本思想线段树,顾名思义,就是由线段组成的树。我们结合图来理解一......
  • 使用MaskableGraphic画线段-生成Mesh方式
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;usingUnityEngine.EventSystems;publicclassUGUIPoplateMesh:MaskableGraphic,IPointerEnterHandler,IPointerExitHandler{protectedoverridevoidO......
  • 凌乱的yyy / 线段覆盖
    题目背景快noip了,yyy很紧张!题目描述现在各大oj上有\(n\)个比赛,每个比赛的开始、结束的时间点是知道的。yyy认为,参加越多的比赛,noip就能考的越好(假的)。所以,他想知道他最多能参加几个比赛。由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加\(2\)个......
  • Luogu3792 由乃与大母神原型和偶像崇拜 - 线段树 - set -
    题目链接:https://www.luogu.com.cn/problem/P3792题解:一点小小的空间震撼(ML:125MB)首先询问可以转化成:区间\([l,r]\)的\(max-min+1=r-l+1\)并且区间内没有重复元素。可以考虑对每个点\(i\)记一个前驱结点\(pr_i\),表示\(a_{pr_i}=a_i\),且\(pr_i\)是\(i\)前面离\(i\)......
  • 隐函数定理的几何应用
    隐函数定理的几何应用一、平面曲线的切线与法线设平面曲线由方程\[F(x,y)=0\tag{1}\]确定,它在\(P_0(x_0,y_0)\)的某领域上满足隐函数定理的条件,于是在点\(P_0\)附近所确定的连续可微隐函数\(y=f(x)\)(或\(x=g(y)\))和方程\((1)\)在\(P_0\)附近表示同一曲线,从而该曲......
  • 线段树
    引入线段树是算法竞赛中常用的用来维护区间信息的数据结构。树状数组可以在$O(\logn)$的时间内实现单点修改、区间查询(求和、求最值、求异或等);而线段树还可以在$O(\logn)$时间内实现区间修改操作,例如将$[L,R]$区间范围内的值都加上一个常数,乘以一个常数,或者都置为某个......
  • Canvas_绘制线段、圆形、文本、图像、视频、处理图像数据
    Canvas_绘制线段、圆形、文本、图像、视频、处理图像数据绘制线段varcanvas1=document.querySelector("#canvas1");varctx=canvas1.getContext("2d");//设置开始路径ctx.beginPath()//设置绘制的起始点ctx.moveTo(50,50);//设置经过某个位置ctx.lineTo(50,30......
  • 线段树学习笔记
    时隔多日,我终于又回来了!这几天我学习几个高级数据结构,来和大家分享一下线段树。线段树,名字好高级啊,是不是非常难学?我个人觉得吧,线段树只要明白原理,记熟模板,做题还是比较容易的。QwQOK,我们切入正题。NO.1whatis线段树看图理解一下(图片还是比较形象的)简单线段树结构图这......
  • 奇异值分解的几何理解
    奇异值分解(SVD)可以通过几何的方式来解释,从而帮助我们理解其含义和应用。首先,我们可以将一个矩阵视为对向量空间的一种变换。假设有一个m×n的矩阵A,其中每一列可以看作是一个向量,而这些向量组成了一个n维的向量空间。奇异值分解可以将这个向量空间的变换分解为三个基本的几何操作:......
  • 低秩分解的几何理解
    低秩分解(Low-rankfactorization)也可以通过几何的方式来解释,帮助我们理解其含义和应用。假设我们有一个m×n的矩阵A,我们希望对其进行低秩分解,即将其分解为两个低秩矩阵的乘积:A≈UV^T。其中,U是一个m×k的矩阵,V是一个n×k的矩阵,k远远小于m和n。几何上,可以将矩阵A视为描述一个向......