题目的意思是判断线段是否和矩形相交,可以枚举矩形的4条边依次判断。(在这题里,矩形包含线段属于相交,需特殊判断) 下面的那个函数可以作为线段相交判断的模板。 #include <iostream> using namespace std; #define Min(x,y) (x<y?x:y) #define Max(x,y) (x<y?y:x) struct Node { int x,y; }; int CrossMutiply(Node& p1,Node& p2,Node& p3)//叉积 { return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } int PointMutiply(Node& p1,Node& p2,Node& p3)//点积 { return (p2.x-p1.x)*(p3.x-p1.x)+(p2.y-p1.y)*(p3.y-p1.y); } bool Segments_Intersect(Node& p1_start,Node& p1_end,Node& p2_start,Node& p2_end)//判断两线段是否相交 { int d1=CrossMutiply(p1_start,p1_end,p2_start); int d2=CrossMutiply(p1_start,p1_end,p2_end); int d3=CrossMutiply(p2_start,p2_end,p1_start); int d4=CrossMutiply(p2_start,p2_end,p1_end); if((d1*d2<0)&&(d3*d4<0)) return true; else if(d1==0&&PointMutiply(p2_start,p1_start,p1_end)<=0) return true; else if(d2==0&&PointMutiply(p2_end,p1_start,p1_end)<=0) return true; else if(d3==0&&PointMutiply(p1_start,p2_start,p2_end)<=0) return true; else if(d4==0&&PointMutiply(p1_end,p2_start,p2_end)<=0) return true; else return false; } int main() { int n; Node rectangle[5],pStart,pEnd; bool flag; scanf("%d",&n); while(n--) { scanf("%d%d%d%d%d%d%d%d",&pStart.x,&pStart.y,&pEnd.x,&pEnd.y,&rectangle[0].x,&rectangle[0].y,&rectangle[2].x,&rectangle[2].y); int min_x=Min(rectangle[0].x,rectangle[2].x); int min_y=Min(rectangle[0].y,rectangle[2].y); int max_x=Max(rectangle[0].x,rectangle[2].x); int max_y=Max(rectangle[0].y,rectangle[2].y); if(pStart.x>=min_x&&pStart.y>=min_y&&pStart.x<=max_x&&pStart.y<=max_y) { if(pEnd.x>=min_x&&pEnd.y>=min_y&&pEnd.x<=max_x&&pEnd.y<=max_y) { printf("T/n"); continue; } } rectangle[4]=rectangle[0]; rectangle[1].y=rectangle[0].y; rectangle[1].x=rectangle[2].x; rectangle[3].y=rectangle[2].y; rectangle[3].x=rectangle[0].x; flag=false; for(int i=0;i<4;i++) { if(Segments_Intersect(pStart,pEnd,rectangle[i],rectangle[i+1])) { flag=true; break; } } if(flag) printf("T/n"); else printf("F/n"); } return 0; }