判断两条线段是否相交
2013-04-16 12:44
309 查看
思路:即利用叉积判断线段两端点是否都相互横跨
#include <iostream>
using namespace std;
struct point
{
double x,y;
};
double min(double x,double y)
{
return x<y?x:y;
}
double max(double x,double y)
{
return x>y?x:y;
}
bool onsegment(point pi,point pj,point pk) //有可能在某线段上
{
if(min(pi.x,pj.x)<=pk.x&&pk.x<=max(pi.x,pj.x))
{
if(min(pi.y,pj.y)<=pk.y&&pk.y<=max(pi.y,pj.y))
{
return true;
}
}
return false;
}
double direction(point pi,point pj,point pk)//计算叉积
{
return (pi.x-pk.x)*(pi.y-pj.y)-(pi.y-pk.y)*(pi.x-pj.x);
}
bool judge(point p1,point p2,point p3,point 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;
if(d1==0&&onsegment(p3,p4,p1))
return true;
if(d2==0&&onsegment(p3,p4,p2))
return true;
if(d3==0&&onsegment(p1,p2,p3))
return true;
if(d4==0&&onsegment(p1,p2,p4))
return true;
return false;
}
int main()
{
point p1,p2,p3,p4;
cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y>>p4.x>>p4.y;
if(judge(p1,p2,p3,p4))
{
cout<<"the two segments are interset"<<endl;
}
else
{
cout<<"the two segments are not interset"<<endl;
}
return 0;
}
#include <iostream>
using namespace std;
struct point
{
double x,y;
};
double min(double x,double y)
{
return x<y?x:y;
}
double max(double x,double y)
{
return x>y?x:y;
}
bool onsegment(point pi,point pj,point pk) //有可能在某线段上
{
if(min(pi.x,pj.x)<=pk.x&&pk.x<=max(pi.x,pj.x))
{
if(min(pi.y,pj.y)<=pk.y&&pk.y<=max(pi.y,pj.y))
{
return true;
}
}
return false;
}
double direction(point pi,point pj,point pk)//计算叉积
{
return (pi.x-pk.x)*(pi.y-pj.y)-(pi.y-pk.y)*(pi.x-pj.x);
}
bool judge(point p1,point p2,point p3,point 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;
if(d1==0&&onsegment(p3,p4,p1))
return true;
if(d2==0&&onsegment(p3,p4,p2))
return true;
if(d3==0&&onsegment(p1,p2,p3))
return true;
if(d4==0&&onsegment(p1,p2,p4))
return true;
return false;
}
int main()
{
point p1,p2,p3,p4;
cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y>>p4.x>>p4.y;
if(judge(p1,p2,p3,p4))
{
cout<<"the two segments are interset"<<endl;
}
else
{
cout<<"the two segments are not interset"<<endl;
}
return 0;
}
相关文章推荐
- 判断两条线段是否相交
- zju1648 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断平面上任意两条线段是否相交-Python实现
- 判断两条线段是否相交
- 如何判断平面上两条线段(注意是线段)是否相交?(某公司校园招聘面试试题)
- 判断两条线段是否相交
- 关于如何判断在平面上的两条线段是否相交
- 已知两条线段端点,判断是否相交及交点
- 判断两条线段是否相交
- 判断两条线段是否相交
- 判断两条线段是否相交
- c# 判断两条线段是否相交(判断地图多边形是否相交)
- 判断两条线段是否相交(三种算法)
- 使用叉积判断两条线段是否相交
- 判断两条线段是否相交 计算几何
- 【算法导论】33.2:判断任意两条线段是否相交
- 判断两条线段是否相交_模版