判断平面上两条直线是否相交
首先引出计算几何学中一个最基本的问题:如何判断向量在
的顺时针方向还是逆时针方向?
把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函数用于计算
上,还是在的延长线上。
下面是用于判断两线段是否相交的主函数。
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;}