判断两线段是否相交——快速排斥与跨立实验
对于两条线段,我们以这两条线段为对角线各自作一个矩形,如图所示,如果这两个矩形没有相交的部分那么这两条线段一定不相交,这样我们可以排除一部分不相交的情况了。
那么又该怎么判断这两个矩形是否相交呢?这就比判断线段要简单的多了,若:
·线段1下面的端点高于线段2上面的端点;
·线段1上面的端点低于线段2下面的端点;
·线段1左面的端点位于线段2右面的端点的右边;
·线段1右面的端点位于线段2左面的端点的左边;
那么我们就可以说这两个矩形不相交,即这两个线段不相交,用代码实现如下:
1 bool quick_judge(point a,point b,point c,point d) 2 { 3 if(a.y>c.y||b.y<d.y||a.x>d.x||b.x<c.x) 4 return false; 5 else return true; 6 }
但是仅这一种判断方式无法解决我们的问题,有反例如下图,两矩形相交但是线段并没有相交,这就需要我们用第二种方法来加以辅助。
·a,b向量构成的平行四边形的面积。
·如果k>0时,那么a正旋转到b的角度为<180°,如果k<0,那么a正旋转到b的角度为>180°,如果k=0 那么a,b向量平行。
那么如何去判断呢,这就需要用到我们上面说到的叉乘了。如在下图中,我们选择线段AB为基准,然后去判断AC×AB与AD×AB是否是同向的,若不是同向的,则证明了B,D两点在线段AB的两边。即
用代码来实现:
1 bool cross_judge(point a,point b,point c,point d) 2 { 3 const double eps=1e-9; 4 double ac,ad,cb,ca; 5 ac=(c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x); 6 ad=(d.x-a.x)*(b.y-a.y)-(d.y-a.y)*(b.x-a.x); 7 ca=(a.x-c.x)*(d.y-c.y)-(a.y-c.y)*(d.x-c.x); //保险起见,把另一条边也判断一下 8 cb=(b.x-c.x)*(d.y-c.y)-(b.y-c.y)*(d.x-c.x); 9 if(ac*ad<eps&&ca*cb<eps) return true; 10 else return false; 11 }
至此,我们将这两个方法结合一下,就可以解决我们的问题了。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const double eps=1e-9; 6 7 struct segment 8 { 9 double x1,x2,y1,y2; 10 }seg[2005]; 11 12 bool judge(segment a,segment b) 13 { 14 if(min(a.x1,a.x2)<max(b.x1,b.x2)&&max(a.x1,a.x2)>min(b.x1,b.x2)&&min(a.y1,a.y2)<max(b.y1,b.y2)&&max(a.y1,a.y2)>min(b.y1,b.y2)) 15 { 16 double v1,v2,v3,v4; 17 v1=(b.x1-a.x1)*(a.y2-a.y1)-(b.y1-a.y1)*(a.x2-a.x1); 18 v2=(b.x2-a.x1)*(a.y2-a.y1)-(b.y2-a.y1)*(a.x2-a.x1); 19 v3=(a.x1-b.x1)*(b.y2-b.y1)-(a.y1-b.y1)*(b.x2-b.x1); 20 v4=(a.x2-b.x1)*(b.y2-b.y1)-(a.y2-b.y1)*(b.x2-b.x1); 21 if(v1*v2<eps&&v3*v4<eps) return true; 22 else return false; 23 } 24 else return false; 25 } 26 27 int main() 28 { 29 int i,j,n,flag=0; 30 while(~scanf("%d",&n)) 31 { 32 flag=0; 33 for(i=0;i<n;i++) scanf("%lf%lf%lf%lf",&seg[i].x1,&seg[i].y1,&seg[i].x2,&seg[i].y2); 34 for(i=0;i<n;i++) 35 for(j=i+1;j<n;j++) 36 { 37 if(judge(seg[i],seg[j])) 38 { 39 flag=1; 40 break; 41 } 42 } 43 if(flag) printf("burned!\n"); 44 else printf("ok!\n"); 45 } 46 return 0; 47 }
ZOJ P1648
转载于:https://www.cnblogs.com/CSGOBESTGAMEEVER/p/10939868.html
判断两线段是否相交——快速排斥与跨立实验相关推荐
- 计算几何_线段交点的快速排斥_跨立实验
附上题的地址 https://vjudge.net/problem/HDU-1086# // 点是否在矩形 // 矩形点是 st 和 ed bool IsPointInRectangle(Point ...
- 计算几何 快速排斥和跨立实验 判断两线段相交
线段P1P2, Q1Q2,判断其是否相交,通过快速排斥和跨立实验则说明相交 首先要知道:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的逆时针方向:若结果大于0,表示向量b在向量a的 ...
- 快速排斥、跨立实验判断线段是否相交
写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...
- python判断两线段是否相交_c语言 判断两直线段是否相交
转了多人的放到一起比较!! //功能:求点在有向直线左边还是右边 //返回:0共线.1左边.-1右边 intleft_right(pointa,pointb,doublex,doubley) { do ...
- [GIS算法] 判断两线段是否相交的四种方案(快速排斥+跨立实验、参数方程求解、凸多边形、点在线的哪一侧)-附C语言实现
文章目录 算法一:快速排斥+跨立试验 代码 算法二:参数方程求解 代码 算法三:凸多边形 算法四:点在线的哪一侧 算法一:快速排斥+跨立试验 重点掌握 [原理]利用矢量的叉乘 [图解] 代码 #def ...
- hdu 1086(判断两线段是否相交)
题意:给出一些线段,问有多少个交点. 解题思路:这里实际就是一个线段相交的模型,下面这个图给出了思路. 如果两线段相交,则两线段必然相互跨立对方.若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ...
- java判断两线段是否相交
首先推荐java的Line2D类自带方法linesIntersect java.awt.geom.Line2D.linesIntersect(x1, y1, x2, y2, x3, y3, x4, y ...
- 线段相交(快速排斥和跨立)
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 本来想用斜率来算,后来觉得要分太多情况,上网发现用快速排斥+ ...
- 判断两线段是否相交,并求交点
首先, 上个示意图. 根据图示, 线段a表示为端点a1和a2, 线段b表示为端点b1和b2. 为了利用向量的叉乘关系, 将线段的端点看成四个向量, 下面用粗体表示向量. 根据向量运算可知 a=a2-a ...
最新文章
- 问一下大家个3D问题:旋转和缩放以及平移中如何插值矩阵?
- python 画三维函数图-Python之Numpy:二元函数绘制/三维数据可视化/3D
- github的使用教程
- mongodb数据库,批量插入性能测试记录
- mysql standalone模式_Boss7 Standalone模式开发配置
- 搞到一个IDEA插件,H哥30秒生成一个Spring Cloud Alibaba工程
- 使用TensorFlow.js的AI聊天机器人四:改进的Trivia Expert
- CVE-2020-1472 | Netlogon 特权提升漏洞预警
- flask 模板 php,Flask 模板系统
- 华为系列设备优先级总结(二)
- java 在类中定义接口_我们可以在Java接口中定义一个类吗?
- J2EE框架技术(SpringMVC) 知识点笔记(8)
- 【面试记录1】爱立信5G基带开发工程师
- scratch编程滑雪者游戏教程
- ai决策_人工智能时代的决策
- Java 8: 元空间(Metaspace)
- 流畅的python 对象引用 可变性和垃圾回收
- 职称以考代评学院考计算机吗,软考与职称的关系,软考是以考代评,不用另外再去评审...
- 《err keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect》
- align_corners 的意义
热门文章
- python成员方法共享吗_python 入坑路 类的特殊成员方法
- activiti mysql数据库表_Mysql安装activiti数据库的2种解决办法
- java shp求相交面积_shp文件自相交处理的方法
- 计算机教学反思博,博文25教学反思
- c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!
- conda deactivate python3_python3的配置解决
- linux中,项目生成的文件的权限为-rw-r-----
- UriComponentsBuilder 拼接URL、解析URL
- Matplotlib 可视化之图表层次结构
- 利用 Python 实现多任务进程