判断线段是否和矩形相交,如果在矩形里也算相交。 初始化的坐标赋值写错了一个数,WA了半天T T 。。还有就是,输入的矩形坐标不一定是左上和右下。。真黑啊 #include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> using namespace std; struct point{ double x,y;}; struct segment{ point a,b;}; const double eps = 1e-6; bool dy(double x,double y) { return x > y + eps;} // x > y bool xy(double x,double y) { return x < y - eps;} // x < y bool dyd(double x,double y) { return x > y - eps;} // x >= y bool xyd(double x,double y) { return x < y + eps;} // x <= y bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向 { return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y); } bool onSegment(point a, point b, point c) { double maxx = max(a.x,b.x); double maxy = max(a.y,b.y); double minx = min(a.x,b.x); double miny = min(a.y,b.y); if( dd(crossProduct(a,b,c),0.0) && dyd(c.x,minx) && xyd(c.x,maxx) && dyd(c.y,miny) && xyd(c.y,maxy) ) return true; return false; } bool segIntersect(point p1,point p2, point p3, point p4) { double d1 = crossProduct(p3,p4,p1); double d2 = crossProduct(p3,p4,p2); double d3 = crossProduct(p1,p2,p3); double d4 = crossProduct(p1,p2,p4); if( xy(d1 * d2,0.0) && xy(d3 * d4,0.0) ) return true; if( dd(d1,0.0) && onSegment(p3,p4,p1) ) return true;//如果不判端点相交,则下面这四句话不需要 if( dd(d2,0.0) && onSegment(p3,p4,p2) ) return true; if( dd(d3,0.0) && onSegment(p1,p2,p3) ) return true; if( dd(d4,0.0) && onSegment(p1,p2,p4) ) return true; return false; } bool solve(point p[],point a,point b) { for(int i=0; i<4; i++) if( segIntersect(p[i],p[(i+1)%4],a,b) ) return true; return false; } bool point_inPolygon(point pot,point p[],int n) { int count = 0; segment l; l.a = pot; l.b.x = 1e10; l.b.y = pot.y; p[n] = p[0]; for(int i=0; i<n; i++) { if( onSegment(p[i],p[i+1],pot) ) return true; if( !dd(p[i].y,p[i+1].y) ) { int tmp = -1; if( onSegment(l.a,l.b,p[i]) ) tmp = i; else if( onSegment(l.a,l.b,p[i+1]) ) tmp = i+1; if( tmp != -1 && dd(p[tmp].y,max(p[i].y,p[i+1].y)) ) count++; else if( tmp == -1 && segIntersect(p[i],p[i+1],l.a,l.b) ) count++; } } if( count % 2 == 1 ) return true; return false; } int main() { int ncases; point p[10]; point a,b; scanf("%d",&ncases); while( ncases-- ) { scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y); scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[2].x,&p[2].y); if( dy(p[0].x,p[2].x) ) swap(p[0].x,p[2].x); if( dy(p[2].y,p[0].y) ) swap(p[0].y,p[2].y); p[1].x = p[0].x; p[1].y = p[2].y; p[3].x = p[2].x; p[3].y = p[0].y; if( solve(p,a,b) || point_inPolygon(a,p,4) && point_inPolygon(b,p,4) ) printf("T/n"); else printf("F/n"); } return 0; }