题意:给定一条直线,和一个矩形,判断此直线是否和矩形有交点. 思路:把矩形的边转换成四条线段,与给定直线判交. 注意:矩形是一个实框,若直线在矩形内部也算有交点. 代码: #include <iostream> #include <cstdio> using namespace std; struct point { double x,y; }; struct line { point p1,p2; }lines[5]; double dmax(double a, double b) { return a > b? a : b; } double dmin(double a,double b) { return a > b? b:a; } double dir(point p1, point p2, point p3) { return (p3.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p3.y-p1.y); } bool on_segment(point p1,point p2, point p3) { double xmin = dmin(p1.x,p2.x); double xmax = dmax(p1.x,p2.x); double ymin = dmin(p1.y,p2.y); double ymax = dmax(p1.y,p2.y); if(xmin <= p3.x && xmax >=p3.x && ymin<= p3.y && ymax >=p3.y) return true; else return false; } bool segment_intersect(point p1,point p2,point p3,point p4) { double d1,d2,d3,d4; d1 = dir(p3,p4,p1); d2 = dir(p3,p4,p2); d3 = dir(p1,p2,p3); d4 = dir(p1,p2,p4); if(((d1>0 && d2<0)||(d1<0 && d2>0))&&((d3>0 && d4<0)||(d3<0 && d4>0))) return true; else if(d1==0 && on_segment(p3,p4,p1)) return true; else if(d2==0 && on_segment(p3,p4,p2)) return true; else if(d3 == 0 && on_segment(p1,p2,p3)) return true; else if(d4==0 && on_segment(p1,p2,p4)) return true; else return false; } int main(void) { int t; cin >> t; while(t--) { int i; bool flag = false; line L; point p,pp; cin >> L.p1.x >>L.p1.y >>L.p2.x >> L.p2.y; cin >>p.x >>p.y>>pp.x>>pp.y; lines[0].p1.x = p.x; lines[0].p1.y = p.y; lines[0].p2.x = pp.x; lines[0].p2.y = p.y; lines[1].p1.x = p.x; lines[1].p1.y = p.y; lines[1].p2.x = p.x; lines[1].p2.y = pp.y; lines[2].p1.x = pp.x; lines[2].p1.y = pp.y; lines[2].p2.x = p.x; lines[2].p2.y = pp.y; lines[3].p1.x = pp.x; lines[3].p1.y = pp.y; lines[3].p2.x = pp.x; lines[3].p2.y = p.y; if(L.p1.x<=dmax(p.x,pp.x)&&L.p1.x>=dmin(p.x,pp.x)&&L.p2.x<=dmax(p.x,pp.x)&&L.p2.x>=dmin(p.x,pp.x) &&L.p1.y<=dmax(p.y,pp.y)&&L.p1.y>=dmin(p.y,pp.y)&&L.p2.y<=dmax(p.y,pp.y)&&L.p2.y>=dmin(p.y,pp.y)) flag = true; for(i=0; i<4; i++) if(segment_intersect(L.p1,L.p2,lines[i].p1,lines[i].p2)) { flag = true; break; } if(flag) cout << "T" << endl; else cout <<"F" << endl; } return 0; }