您的位置:首页 > 其它

如何确定两个线段是否相交;叉积的利用;

2010-06-03 17:33 239 查看
#include <iostream>
using namespace std;

typedef struct
{
int x,y;
}Point;

//判断线段端点在直线的哪一侧.
int direction(Point p1,Point p2,Point p3)
{
return (p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y);
}

//判断与直线共线的点是否在线段上
bool onSegment(Point p1,Point p2,Point p3)
{
int left,right;

if(p1.x<=p2.x)
{
left=p1.x;
right=p2.x;
}
else
{
left=p2.x;
right=p1.x;
}

if(left<=p3.x&&p3.x<=right)
{
return true;
}
else
{
return false;
}
}

bool segmentsIntersect(Point p1,Point p2,Point p3,Point p4)
{
int d1,d2,d3,d4;
/*
以下2句作用:以p3p4所在直线为标准,判断线段p1p2是否跨越p3p4所在直线
即判断p1在p3p4的一边,p2在p3p4另一边
*/
d1=direction(p3,p4,p1);
d2=direction(p3,p4,p2);
/*
以下2句作用:同上,不过这次判断的是p3p4是否跨越了p1p2所在直线
*/
d3=direction(p1,p2,p3);
d4=direction(p1,p2,p4);

//互相跨越,必相交
if(d1*d2<0&&d3*d4<0)
{
return true;
}
/*
否则,看是否端点在另一个线段上
*/
else if(0==d1&&onSegment(p3,p4,p1)==true)
{
return true;
}
else if(0==d2&&onSegment(p3,p4,p2)==true)
{
return true;
}
else if(0==d3&&onSegment(p1,p2,p3)==true)
{
return true;
}
else if(0==d4&&onSegment(p1,p2,p4)==true)
{
return true;
}
else
{
return false;
}
}

int main()
{
Point p1,p2,p3,p4; //线段p1p2 ,p3p4
cin>>p1.x>>p1.y>>p2.x>>p2.y>>p3.x>>p3.y>>p4.x>>p4.y;
if(segmentsIntersect(p1,p2,p3,p4))
{
cout<<"相交"<<endl;
}
else
{
cout<<"不相交"<<endl;
}

return 0;
}


 

算法导论:577页,算法不解释了.

 

主要就是用直线与线段判断是否跨越,利用叉积判断点与线的位置关系.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 include struct