判断平面上两条直线是否相交
来源:互联网 发布:图旺旺广告设计软件 编辑:程序博客网 时间:2024/05/16 05:30
判断平面上两条直线是否相交
分类: 数据结构与算法设计2013-09-17 09:07 117人阅读 评论(0) 收藏 举报
直线相交
首先引出计算几何学中一个最基本的问题:如何判断向量在的顺时针方向还是逆时针方向?
把p0定为原点,p1的坐标是(x1,y1),p2的坐标是(x2,y2)。向量的叉积(cross product)实际上就是矩阵的行列式:
当叉积为正时,说明在的顺时针方向上;叉积为0说明两向量共线(同向或反向)。
当同时满足:
(1)和在的两侧(即一个顺时针方向上,一个在逆时针方向上)
(2)和在的两侧
时可肯定和相交。
图1
图1是线段相交的一般情形。
图2只满足第(1)条,不满足第(2)条所以不能证明和相交。
图2
图3和图4是一种特殊情况,它不满足第(2)条,因为和重合,即和的叉积为0。
可见当叉积为0时要分情况讨论,当p3在线段p1p2上时两线段相交;当p3在线段p1p2的延长线上时两线段不相交。
- double direction(pair<double,double> p1,pair<double,double> p2,pair<double,double> p3){
- pair<double,double> d1=make_pair(p3.first-p1.first,p3.second-p1.second);
- pair<double,double> d2=make_pair(p2.first-p1.first,p2.second-p1.second);
- return d1.first*d2.second-d1.second*d2.first;
- }
direction函数用于计算和的叉积。
- bool OnSegment(pair<double,double> p1,pair<double,double> p2,pair<double,double> p3){
- double x_min,x_max,y_min,y_max;
- if(p1.first<p2.first){
- x_min=p1.first;
- x_max=p2.first;
- }else{
- x_min=p2.first;
- x_max=p1.first;
- }
- if(p1.second<p2.second){
- y_min=p1.second;
- y_max=p2.second;
- }else{
- y_min=p2.second;
- y_max=p1.second;
- }
- if(p3.first<x_min || p3.first>x_max || p3.second<y_min || p3.second>y_max)
- return false;
- else
- return true;
- }
当p3在直线p1p2上时,OnSegment函数用于确认p3在上,还是在的延长线上。
下面是用于判断两线段是否相交的主函数。
- bool SegmentIntersect(pair<double,double> p1,pair<double,double> p2,pair<double,double> p3,pair<double,double> p4){
- double d1=direction(p3,p4,p1);
- double d2=direction(p3,p4,p2);
- double d3=direction(p1,p2,p3);
- double d4=direction(p1,p2,p4);
- if(d1*d2<0 && d3*d4<0)
- return true;
- else if(d1==0 && OnSegment(p3,p4,p1))
- return true;
- else if(d2==0 && OnSegment(p3,p4,p2))
- return true;
- else if(d3==0 && OnSegment(p1,p2,p3))
- return true;
- else if(d4==0 && OnSegment(p1,p2,p4))
- return true;
- else
- return false;
- }
- int main(){
- double x1,y1,x2,y2,x3,y3,x4,y4;
- cout<<"Please input x1,y1,x2,y2,x3,y3,x4,y4 by order"<<endl;
- cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
- pair<double,double> p1=make_pair(x1,y1);
- pair<double,double> p2=make_pair(x2,y2);
- pair<double,double> p3=make_pair(x3,y3);
- pair<double,double> p4=make_pair(x4,y4);
- if(SegmentIntersect(p1,p2,p3,p4))
- cout<<"YES"<<endl;
- else
- cout<<"NO"<<endl;
- return 0;
- }
- 判断平面上两条直线是否相交
- C++判断两条平面直线是否相交
- 判断平面上两线段是否相交,顺便解释判断点在直线的位置...
- 判断两直线是否相交
- 判断两直线是否相交
- 判断平面上两直线相交
- 判断平面上两线段是否相交
- poj 1410(判断直线是否相交)
- 判断两条直线是否相交
- 判断两条直线是否相交
- 判断直线是否相交,若相交,则返回交点
- 如何判断平面上两条线段(注意是线段)是否相交?(某公司校园招聘面试试题)
- 判断二维平面上两线段是否相交
- POJ - 3304 :Segments__判断直线和线段是否 相交
- cocos2d-x 判断两条直线是否相交
- POJ 3304 Segments (判断直线和线段是否相交)
- poj3304-Segments-判断直线和线段是否相交
- POJ 3304 Segments(判断线段和直线是否相交)
- c++读取utf8等不同编码文件
- wdlinux的安装目录
- 人生轨迹
- JavaScript加强之自定义callback
- Myeclipse中如何更改jsp默认的打开方式
- 判断平面上两条直线是否相交
- ZOJ 3525 Disappearance(扫描线)
- spring security3.x学习(8)_web的投票器和spEL配置
- 深入剖析Tomcat会话机制
- ORA-01552: 非系统表空间 'USERS' 不能使用系统回退段的处理
- uva 590 - Always on the run(01背包)
- 网络编程常见问题
- ubuntu添加中文输入法
- UVa:10720 Graph Construction