向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2):

首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向;若结果大于0,表示向量b在向量a的逆时针方向;若等于0,表示向量a与向量b平行。(顺逆时针是指两向量平移至起点相连,从某个方向旋转到另一个向量小于180度)。如下图:


在上图中,OA×OB = 2 > 0, OB在OA的逆时针方向;OA×OC = -2 < 0,OC在OA的顺势针方向。即叉乘结果大于0,后一个在前一个的逆时针方向;小于零,后一个在前一个的顺时针方向。

那如何来判断两线段是否相交呢?

假设有两条线段AB,CD,若AB,CD相交,我们可以确定:

1.线段AB与CD所在的直线相交,即点A和点B分别在直线CD的两边;

2.线段CD与AB所在的直线相交,即点C和点D分别在直线AB的两边;

上面两个条件同时满足是两线段相交的充要条件,所以我们只需要证明点A和点B分别在直线CD的两边,点C和点D分别在直线AB的两边,这样便可以证明线段AB与CD相交了。

那判断两线段是否相交与一开始提到的向量叉乘定理有什么关系呢?有,我们可以通过叉乘来证明上面说的充要条件。看下图:


在上图中,线段AB与线段CD相交,于是我们可以得到两个向量AC,AD,C和D分别在AB的两边,向量AC在向量AB的逆势针方向,AB×AC > 0;向量AD在向量AB的顺势针方向,AB×AD < 0,两叉乘结果异号。

这样,方法就出来了:如果线段CD的两个端点C和D,与另一条线段的一个端点(A或B,只能是其中一个)连成的向量,与向量AB做叉乘,若结果异号,表示C和D分别在直线AB的两边,若结果同号,则表示CD两点都在AB的一边,则肯定不相交。

当然,不能只证明C,D在直线AB的两边,还要用相同的方法证明A,B在直线CD的两边,两者同时满足才是线段相交的充要条件。

不过,线段相交还有一些特殊情况:

1.只有1点相交,如下图:


上图中,线段AB与CD相交于C点,按照之前介绍的方法,我们可以连成两向量AD和AC,这时候,我们发现,AC与AB共线,AB×AC = 0;而AB×AD < 0;两者并不异号,可实际上仍然相交。所以当出现两叉乘结果中,有一方为0,也可以看成点CD在直线AB的两边。

2.两条线段重合,如下图:

在上图中,线段AB与线段CD重合,重合部分为CB,这种重合的情况要特殊判断:

首先,我们给没条线段的两个端点排序,大小判断方法如下:横坐标大的点更大,横坐标相同,纵坐标大的点更大。

排好序后,每条线段中,小的点当起点,大的当终点。我们计算向量AB×向量CD,若结果为0,表示线段AB平行CD,平行才有了重合的可能;但平行也分共线和不共线,只有共线才有可能重合,看下图:


上图中,第一种情况不共线,第二种情况共线。那如何来判断是否共线呢?

我们可以在两条线段中各取一点,用这两点组成的向量与其中一条线段进行叉乘,结果若为0,就表示两线段共线,如下图:

我们取向量BC,若BC×CD = 0,表示两点共线,即是第二种情况,否则就是第一种情况。第一种情况肯定不相交。猴子为什么不喜欢平行线?因为他们没有相交。。。(尬)

然然然然然而,即使他们共线,却还是不一定重合,就如上图中第二种情况。这时候,之前给点排序的妙处就体现出来了:

若一条线段AB与另一条线段CD共线,且线段AB的起点小于等于线段CD的起点,但线段AB的终点(注意是终点)大于等于线段CD的起点(注意是起点),或者交换一下顺序,CD的起点小于AB的起点…只要满足其中一个,就表示有重合部分。

###   l1 [xa, ya, xb, yb]   l2 [xa, ya, xb, yb]
def Intersect(l1, l2):v1 = (l1[0] - l2[0], l1[1] - l2[1])v2 = (l1[0] - l2[2], l1[1] - l2[3])v0 = (l1[0] - l1[2], l1[1] - l1[3])a = v0[0] * v1[1] - v0[1] * v1[0]b = v0[0] * v2[1] - v0[1] * v2[0]temp = l1l1 = l2l2 = tempv1 = (l1[0] - l2[0], l1[1] - l2[1])v2 = (l1[0] - l2[2], l1[1] - l2[3])v0 = (l1[0] - l1[2], l1[1] - l1[3])c = v0[0] * v1[1] - v0[1] * v1[0]d = v0[0] * v2[1] - v0[1] * v2[0]if a*b < 0 and c*d < 0:return Trueelse:return False

如何判断两条线段相交(python实现)相关推荐

  1. JAVA计算两条直线的交点(判断两条线段相交)

    //计算两条直线的交点 //输入四个点,前两个点确定线段1,后两个点确定线段2 //输出交点坐标 public class Main{public static void main(String ar ...

  2. 判断两条线段相交(跨立实验)

    题目描述 [题意] 有n条线段(编号为1~n),按1~n的顺序放在二维坐标系上(就是先放1号,再放2号--), 要求输出最上面的那些线段的编号(就是没有其他线段压在它上面的那些线段) [输入格式] 第 ...

  3. 判断两条线段/直线相交,并求交点

      一.矢量基本知识     因为后面的计算需要一些矢量的基本知识,这里只是简单的列举如下,如果需要更加详细的信息,可以自行搜索wikipedia或google. 1.矢量的概念:如果一条线段的端点是 ...

  4. 二维空间内,如何判断两条线段是否相交,相离,平行,重合,并求交点

    首先,假设有两条线段p,q,求这两条线段的空间关系. 我们把两条线段的四个顶点看为向量,用坐标表示:p1(p1x,p1y), p2(p2x,p2y), q1(q1x,q1y), q2(q2x, q2y ...

  5. 计算几何-判断两条线段是否相交

    原理:如果两条线段相交,那么必须跨立,就是以一条线段为标准,另一条线段的两端点一定在这条线段的两段 也就是说a b两点在线段cd的两端,c d两点在线段ab的两端 struct point() {do ...

  6. 如何判断两条线段是否相交

    本篇是在 [C++笔记]如何判断2个线段相交 的基础上加上自己的理解和实践总结出的判断两线段是否相交的方法. 判断两条线段是否相交 先附上判断函数 bool judge(int Ax1,int Ay1 ...

  7. 判断两条线段是否相交 java_判断两个线段是否相交02

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  8. 【数学计算】判断两条线段是否相交+计算两条线段的交点和夹角

    序言 还是那句话,学习是为了应用.书到用时方恨"用得少" 1. 计算两条直线的交点 直线一般式方程 A x + B y + C = 0 Ax+By+C = 0 Ax+By+C=0 ...

  9. 两条线段相交判断学习理解

    两条线段相交判断学习理解 两条线段相交判断可以分为两步: 1,快速排斥实验 2,跨立实验 详细解释: 第一步检查以线段A为对角线的矩形和以线段B对角线的矩形是否相交,如果不相交则两条线段必然不相交,可 ...

最新文章

  1. s5 android5.0内存泄漏,android-最初从位图泄漏了未引用的byte [],但被回收的()导致内存泄漏(直到活动停止)...
  2. 我眼中的Linux设备树(五 根节点)
  3. opencv中图像的基本结构 类型的定义
  4. C++ 面试知识总结
  5. SpringMVC环境简单搭建
  6. MongoDB 基础浅谈
  7. 【云快讯】之五十五《IBM推出Data Warehouse数据仓库云服务》
  8. PoolTogether本周Loot Box奖金组合中新增加入ESSAY代币
  9. butterknife 配置了点击和绑定无效
  10. SHOP++ JTM2.5发布
  11. LaTeX 安装及环境配置
  12. Java版本中最好用的网易云音乐、qq音乐api请求工具,你还在忙于如何使用java调音乐api?来看下这里的实现
  13. linux系统开启ntp服务器配置,Linux系统 NTP服务器配置详解
  14. 串口连接交换机,进行交互
  15. 对数及对比度拉伸变换
  16. 自然资源一体化平台(一站式服务平台)
  17. 显卡系列和种类你了解多少?AMD、NVIDIA显卡盘点
  18. Android音视频全面介绍与代码实践之音效(四)
  19. 初识MFC----MFC简介
  20. Unity【Dynamic Bone】- 关于人物模型头发、衣物等细节的处理

热门文章

  1. vim复制粘贴导致多行出现#号解决办法
  2. 关于QQ分享功能的一些总结
  3. 《越狱》中的项目管理
  4. HDU 4562 守护雅典娜(DAG上的最长路)
  5. python修改屏幕分辨率_Python学习第150课——虚拟机切换鼠标状态以及调整桌面分辨率...
  6. 检测四边形(多边形)
  7. 应用宝苹果版_点赞应用ios版下载-点赞应用苹果版下载v1.1
  8. HikariPool-1 - Connection is not available 配置
  9. kindle dx 不能登录amazon store的解决方法
  10. JavaScript中事件循环的理解 Event Loop