两线相交问题

1、问题描述

判断二维平面上两条直线是否相交。

2、数学基础

2.1向量:

  既有方向又有大小的量
  通常情况下会将向量放到坐标系中,常用的是笛卡尔坐标系,向量起始点通常放到原点(注:没有固定的起点,只要方向相同,大小相等,就认为两向量是相同的,但为了用数值坐标来表示向量,将起始点放到原点),因此,三维向量可以写成如下形式:
在这里插入图片描述

2.2 向量的点积

2.2.1 定义

   点积(对应元素相乘相加):也叫数量积。结果是一个向量在另一个向量方向上投影的长度,是一个标量。
在这里插入图片描述
在这里插入图片描述
结果是一个数。

2.2.2 几何意义:投影

向量A到向量B上投影的长度。

在这里插入图片描述

2.2.3 应用举例

  点乘用来判断两个向量是否垂直,因为比较好算。也可以用来计算一个向量在某个方向上的投影长度,就像定义一样。
求角度:
在这里插入图片描述

2.3 向量的叉乘

2.3.1 定义

  向量积,数学中又称外积、叉积,物理中称矢积、叉乘,是一种在向量空间中向量的二元运算。与点积不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量和垂直。
在这里插入图片描述

2.3.2 计算

a×b=c,其中|c|=|a||b|·sinθ,c的方向遵守右手定则在这里插入图片描述

在这里插入图片描述
叉乘向量方向判断

2.3.3 几何意义

  c是垂直a、b所在平面,且以|b|·sinθ为高、|a|为底的平行四边形的面积。

2.3.4 应用举例

判断两个线段是否相交

可以用点乘和叉乘来进行判断,这可以应用于星载激光高度计测高剖面进行交叉点的查找和最小二乘平差,从而降低轨道误差,定向误差,和计时误差等的影响。

3、判断两个线段是否相交

3.1 快速排斥

  即判断以两线段为对角线的矩形是否相交,若不相交,则两线段一定不相交。而判断两个矩形是否相交,如果任一矩形的最右端都大于另一矩形的最左端且任一矩形最高端大于另一矩形的最低端,那么矩形相交;反之,只要其中任一条件不满足,两矩形不相交。经过这一步之后可以将大部分不符合条件的线段排除掉。
在这里插入图片描述

3.2: 判断两线段是否相交

  如果两线段相交,则两线段必须互相跨立对方,即其中任一线段的两端一定在另一线段的两侧 。
在这里插入图片描述

  如上图所示:线段P1P2与线段P3P4相交,则P1和P2一定在线段P3P4的两侧,所以有(P3P1 × P3P4)· (P3P2 × P3P4)< 0;是因为根据右手法则,P3P1 × P3P4得到的新向量和P3P2 × P3P4得到的新向量方向相反,大于90°。因为计算点积时cosθ<0(θ>90°)。故叉乘后再进行点积肯定小于0。
  同理如果P3和P4在线段P1P2两侧那么有(P2P3 × P2P1)· (P2P4 × P2P1)< 0:如果同时满足以上两条那么就可以证明线段P1P2与线段P3P4相交。

3.3 python代码实现

import numpy as np

def cross(array1, array2):
   return array1[0] * array2[1] - array2[0] * array1[1]

def isLineIntersectLine(point11, point12, point21, point22):
   result1 = cross(point11 - point21, point12 - point21) \
             * cross(point11 - point22, point12 - point22)
   result2 = cross(point21 - point11, point22 - point11) \
             * cross(point21 - point12, point22 - point12)
   if result1 < 0 and result2 < 0:
      return True
   else:
      return False

if __name__ == "__main__":
   if isLineIntersectLine(np.array([0,2]),np.array([3,2]),np.array([0,1]),np.array([3,3])):
      print("有交点!")
   else:
      print("无交点!")

4、参考链接:

1、 判断两个线段相交问题(快速排斥实验&跨立实验) (计算几何).
2、 点乘和叉乘的区别是什么?.
3、 计算几何_直线求交点_线段判相交.
4、 百度百科:向量积.
5、 计算几何——快速排斥实验和跨立实验.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值