判断两线段是否相交
算法原理:黑书597页
基础习题: UVA10902
typedef double db; //快速矩阵排除 inline bool fast(db x1,db y1,db x2,db y2,db x3,db y3,db x4,db y4){ return (max(x1,x2)>=min(x3,x4)&&max(x3,x4)>=min(x1,x2)&&max(y1,y2)>=min(y3,y4)&&max(y3,y4)>=min(y1,y2)); } //求矢量积 inline db cross_product(db x1,db y1,db x2,db y2){ return x1*y2-x2*y1; } //跨立实验*2 inline bool cross(db x1,db y1,db x2,db y2,db x3,db y3,db x4,db y4){ db a,b,c,d; a=cross_product(x3-x1,y3-y1,x2-x1,y2-y1); b=cross_product(x4-x1,y4-y1,x2-x1,y2-y1); c=cross_product(x1-x3,y1-y3,x4-x3,y4-y3); d=cross_product(x2-x3,y2-y3,x4-x3,y4-y3); return (a>0&&b<0||a<0&&b>0)&&(c>0&&d<0||c<0&&d>0); } //判断两条线段是否相交 inline bool segmentcross(db x1,db y1,db x2,db y2,db x3,db y3,db x4,db y4){ if (fast(x1,y1,x2,y2,x3,y3,x4,y4)) if (cross(x1,y1,x2,y2,x3,y3,x4,y4)) return 1; return 0; }