#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页,算法不解释了. 主要就是用直线与线段判断是否跨越,利用叉积判断点与线的位置关系.