线段相交判断
来源:互联网 发布:qq空间辅助软件 编辑:程序博客网 时间:2024/06/04 19:03
http://blog.csdn.net/tengchongwei/article/details/72922056
1.快速排斥实验。
设以线段P1P2为对角线的矩形为R,设以线段Q1Q2为对角线的矩形为T,如果R和T不相交,则两线段不相交。
所以P1P2和Q1Q2相交的必要条件是以他们为对角线的矩形相交,即:
min(p1.x,p2.x) <= max(q1.x,q2.x) &&min(q1.x,q2.x) <= max(p1.x,p2.x) &&min(p1.y,p2.y) <= max(q1.y,q2.y) &&min(q1.y,q2.y) <= max(p1.y,p2.y);
a、若P1P2跨立Q1Q2,则矢量(P1-Q1)和(P2-Q1)位于矢量(Q2-Q1)的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。
等价于
(Q1.x-P1.x,Q1.y-P1.y) × ( Q1.x-Q2.x,Q1.y-Q2.y ) * ( Q1.x-P2.x,Q1.y-P2.y ) × ( Q1.x-Q2.x,Q1.y-Q2.y ) < 0
等价于
((Q1.x-P1.x)*(Q1.y-Q2.y)-(Q1.y-P1.y)*( Q1.x-Q2.x)) * ((Q1.x-P2.x)*(Q1.y-Q2.y)-(Q1.y-P2.y)*(Q1.x-Q2.x)) < 0
b、若Q1Q2跨立P1P2,则矢量(Q1-P1)和(Q2-P1)位于矢量(P2-P1)的两侧,即( Q1 - P1 ) × ( P2 - P1 ) * ( Q2 - P1 ) × ( P2 - P1 ) < 0。
等价于
(P1.x-Q1.x,P1.y-Q1.y) × ( P1.x-P2.x,P1.y-P2.y ) * ( P1.x-Q2.x,P1.y-Q2.y ) × ( P1.x-P2.x,P1.y-P2.y ) < 0
等价于((P1.x-Q1.x)*(P1.y-P2.y)-(P1.y-Q1.y)*(P1.x-P2.x)) * ((P1.x-Q2.x)*(P1.y-P2.y)-(P1.y-Q2.y)*( P1.x-P2.x)) < 0
a和b两个不等式同时满足时即可判断两条线段相交。
排斥实验和跨立实验的示例如下图所示。
bool isLineSegmentCross(const Point &P1,const Point &P2,const Point &Q1,const Point &Q2)//跨立判断{ if( ((Q1.x-P1.x)*(Q1.y-Q2.y)-(Q1.y-P1.y)*( Q1.x-Q2.x)) * ((Q1.x-P2.x)*(Q1.y-Q2.y)-(Q1.y-P2.y)*(Q1.x-Q2.x)) < 0 || ((P1.x-Q1.x)*(P1.y-P2.y)-(P1.y-Q1.y)*(P1.x-P2.x)) * ((P1.x-Q2.x)*(P1.y-P2.y)-(P1.y-Q2.y)*( P1.x-P2.x)) < 0 ) return true; else return false;}
- 判断线段相交
- 判断线段相交程序
- 判断线段相交
- 怎样判断线段相交
- POJ1269(判断线段相交)
- 判断线段相交
- 判断线段相交
- 判断线段相交
- 判断线段相交
- 判断两个线段相交
- 判断线段相交思想
- 判断线段相交模板
- 线段相交的判断
- 判断线段是否相交
- poj3565Ants【线段相交判断】
- 判断线段相交
- 判断线段相交
- POJ2653->判断线段相交
- HDU 6078 2017 Multi-University Training Contest
- 如何使用socket实现unity和Winform之间通信
- UIImagePickerController使用
- 小白学习日记1:PL/SQL连接本地Oracle数据库Part1
- log4j管理日志
- 线段相交判断
- 暑期ssh框架之struts2学习笔记一
- C++中的向上类型转换以及早/晚捆绑笔记
- 2017.08.03回顾
- POJ 1704 Georgia and Bob (Nim博弈)
- 导入maven项目后,完美编译,但是运行报:reflect-MalformedParameterizedTypeException
- Android RecyclerView禁止滑动事件
- 设计模式-中介者模式-mediator-python
- 试试54款开源服务器软件 (比较知名的软件大集合)