写在前面

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

算法详解

首先我们看一下快速排斥实验,快速排斥实验也就是以两条线段作为对角线做矩形,判断两个矩形是否相交,那么我们这里可以知道:

1)如果两个矩形不相交,那么线段一定不相交

2)如果两个矩形相交,那么线段不一定相交,如下图

所以这里我们首先就要判断两条线段形成的矩形是否相交,只有相交我们才要继续进行判断后面的线段是否相交.......

跨立实验:前面我们知道叉积可以用来判断两个向量之间的位置关系(顺时针还是逆时针关系),那么这里我们就会用到这个性质

我们知道如果两个线段相交的话,那么一条线段两边的两个点要位于另一条线段的两边,只有两条线段都满足这个条件,我们就可以判定这两条直线相交了,那么我们这里所说的一条线段两个端点位于另一条线段的两边,这就是其他博客中提到的跨立吧

那么我们就用叉积来对是否满足这个条件进行判断:

取其中一个向量作为中间向量,中间向量中开始端点作为另外两个向量的起点,判断三个向量之间的位置关系即可:

第一个图中: (ca × cd)(cd × cb) >= 0 我们即可判断满足跨立条件

第二个图中: (bc × ba)(ba × bd) >=0 我们即可判断满足跨立条件

第三个图中: (bc × ba)(ba × bd)  < 0不满足跨立条件

第四个图中: (ca × cd)(cd × cb) >= 0我们即可判断满足跨立条件

那么我们就可以知道上面条件就是判断跨立是否成立的条件了,那么这样我们线段是否相交就已经可以解决了.

栗子及模板

zoj1648

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define INF 0x3f3f3f3fusing namespace std;
const int MAXN = 2100;
struct Point
{double x,y;
}line[MAXN][2];double mult(Point p0,Point p1,Point p2)  //叉积计算,p0为公用节点
{return (p0.x - p1.x) * (p0.y - p2.y) - (p0.y - p1.y) * (p0.x - p2.x);
}
//aa、bb属于同一个矩形     cc、dd属于同一个矩形         相交返回true,不相交返回false
bool Judge(Point aa,Point bb,Point cc,Point dd)
{//判断两个形成的矩形不相交if(max(aa.x , bb.x) < min(cc.x , dd.x)) return false;     if(max(aa.y , bb.y) < min(cc.y , dd.y)) return false;if(max(cc.x , dd.x) < min(aa.x , bb.x)) return false;if(max(cc.y , dd.y) < min(aa.y , bb.y)) return false;//现在已经满足快速排斥实验,那么后面就是跨立实验内容(叉积判断两个线段是否相交)if(mult(aa,cc,bb) * mult(aa,bb,dd) < 0) return false;           //正确的话也就是aa,bb要在cc或者dd的两边if(mult(cc,aa,dd) * mult(cc,dd,bb) < 0) return false;return true;
}int main()
{int n;while(~scanf("%d",&n)){bool flag = true;for(int i = 0;i < n;i ++)scanf("%lf%lf%lf%lf",&line[i][0].x,&line[i][0].y,&line[i][1].x,&line[i][1].y);for(int i = 0;i < n;i ++)for(int j = i+1;j < n;j ++){if(Judge(line[i][0],line[i][1],line[j][0],line[j][1])) // 判断两条直线是否相交{flag = false;break;}if(!flag) break;}if(!flag) printf("burned!\n");else printf("ok!\n");}return 0;
}

参考博客

https://blog.csdn.net/Dacc123/article/details/51219491

https://blog.csdn.net/sizaif/article/details/79192165

快速排斥、跨立实验判断线段是否相交相关推荐

  1. 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)

    一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...

  2. 跨立实验判断线段是否相交-POJ3304

    在二维坐标下介绍一些定义: 点:A(x1,y1),B(x2,y2) 向量:向量AB=( x2 - x1 , y2 - y1 )= ( x , y ); 向量的模 |AB| = sqrt ( x*x+y ...

  3. [GIS算法] 判断两线段是否相交的四种方案(快速排斥+跨立实验、参数方程求解、凸多边形、点在线的哪一侧)-附C语言实现

    文章目录 算法一:快速排斥+跨立试验 代码 算法二:参数方程求解 代码 算法三:凸多边形 算法四:点在线的哪一侧 算法一:快速排斥+跨立试验 重点掌握 [原理]利用矢量的叉乘 [图解] 代码 #def ...

  4. 计算几何 快速排斥和跨立实验 判断两线段相交

    线段P1P2, Q1Q2,判断其是否相交,通过快速排斥和跨立实验则说明相交 首先要知道:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的逆时针方向:若结果大于0,表示向量b在向量a的 ...

  5. 快速排斥实验amp;跨立实验 判断两直线是否相交

    两条线段有且仅有一个公共点,且这个点不是任何一条线段的端点时,称这两条线段是严格相交的. 也就是说线段不严格相交时可以将端点作为交点,但本文不讨论不严格相交,只讨论严格相交的情况(即使它们在算法实现上 ...

  6. 判断线段是否相交:快速排斥+跨立

    矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量p2 矢量的加减 设二维矢量 P = (x1, y1), Q = ...

  7. java判断线段是否相交函数_计算几何-判断线段是否相交

    计算几何-判断线段相交 判断两线段是否相交: 快速排斥 跨立实验(这两个词也是我看博客的时候看到的,觉得挺高大上的就拿过来用了,哈哈哈) 1. 快速排斥:就是初步的判断一下,两条线段是不是相交,以两条 ...

  8. 暑假集训#2 div1 J 四点直角 J - Space Invader 四点共面+跨立实验

    题意:给你四个点,判断能否先依次通过A,B两点,然后再在某个地方只进行一次直角转弯再一次经过C,D两点: #include <iostream> #include <cstdio&g ...

  9. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

最新文章

  1. 网络管理常用命令之二 - Ipconfig 命令详解(图文)
  2. 北大毕业典礼上,一男博士求婚女硕士成功,网友直呼:科研人的爱情太甜了!...
  3. Delphi 2009 超前预知!
  4. javascript基本语法(输入输出语句,变量常量,数据类型,运算符,流程控制语句,数组,函数)
  5. 前端判断是否安装桌面应用_前端开发人员的桌面应用神器 Electron
  6. php 伪造请求连接,phpcurl发送伪造请求
  7. HTAP数据库 PostgreSQL 场景与性能测试之 1 - (OLTP) 点查
  8. leetcode 1.两数之和 (two sum)
  9. Oracle RAC系列之:ASM基本操作维护
  10. java 协同过滤算法_基于用户的协同过滤算法(Java实现或R语言实现)
  11. HTML5之HTML+CSS3技术介绍
  12. 在excel中如何筛选重复数据_如何将Excel重复数据筛选出来?简单技巧有三种!...
  13. Second season seventeenth episode,Chandler gets a new roommate
  14. win10重装系统后Mysql环境和数据的恢复(无需重装Mysql)
  15. 百度统计的使用技巧_SEO建议
  16. UI组件介绍(for设计师)
  17. mysql中selec sum返回null的解决方法
  18. 渗透测试-不死马的创建和查杀
  19. 从零开发一款笔记APP——神马笔记WhatsNote
  20. vue视频,vue视频下载

热门文章

  1. 典型相关分析(CCA)代码分析
  2. 步步为营 .NET 设计模式学习笔记 一、开篇(设计模式之泡妞二十三招)
  3. 写给程序猿们的交互设计
  4. TensorFlow升级新版本后TypeError: __new__() got an unexpected keyword argument 'serialized_options'
  5. 金仓数据库 KingbaseES 插件参考手册 pg_partman
  6. 网上书店平台---需求分析
  7. 终于明白迅雷的最终目的了,我是不是很笨? (转)
  8. 众美集团积极布局天津 众美·南湖湾赢得良好口碑
  9. Xobni Free增强了Outlook的搜索和联系方式
  10. MOOC 北京大学 《人工智能实践》 课程笔记(文末有全部代码)