题解 : 多边形可以看成许多条线段,依次判断线段是否存在交点就可以了,注意需要判断线段是否在多边形内部 (用坐标判断一下就可以了)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define eps 1e-8
using namespace std
struct point{
double x,y
}
struct line{
point a,b
}A[100010]
double MAX(double a,double b){
return a>b?a:b
}
double MIN(double a,double b){
return a<b?a:b
}
bool judge(int a,int b){
if(MIN(A[a].a.x,A[a].b.x)>MAX(A[b].a.x,A[b].b.x)||MIN(A[a].a.y,A[a].b.y)>MAX(A[b].a.y,A[b].b.y)||MIN(A[b].a.x,A[b].b.x)>MAX(A[a].a.x,A[a].b.x)||MIN(A[b].a.y,A[b].b.y)>MAX(A[a].a.y,A[a].b.y))
return false
double h,i,j,k
h=(A[a].b.x-A[a].a.x)*(A[b].a.y-A[a].a.y)-(A[a].b.y-A[a].a.y)*(A[b].a.x-A[a].a.x)
i=(A[a].b.x-A[a].a.x)*(A[b].b.y-A[a].a.y)-(A[a].b.y-A[a].a.y)*(A[b].b.x-A[a].a.x)
j=(A[b].b.x-A[b].a.x)*(A[a].a.y-A[b].a.y)-(A[b].b.y-A[b].a.y)*(A[a].a.x-A[b].a.x)
k=(A[b].b.x-A[b].a.x)*(A[a].b.y-A[b].a.y)-(A[b].b.y-A[b].a.y)*(A[a].b.x-A[b].a.x)
return h*i<=eps&&j*k<=eps
}
int main()
{
int t,i,j,k
double xleft,ytop,xright,ybottom
double x1,y1,x2,y2
scanf("%d",&t)
while(t--){
scanf("%lf%lf%lf%lf",&A[0].a.x,&A[0].a.y,&A[0].b.x,&A[0].b.y)
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2)
xleft=MIN(x1,x2)
ybottom=MIN(y1,y2)
A[1].a.x=xleft
A[2].a.x=xleft
A[3].a.x=xright
A[4].a.x=xright
for(i=1
if(judge(0,i))break
}
bool flag=false
if(A[0].a.x<=xright&&A[0].a.x>=xleft&&A[0].a.y>=ybottom&&A[0].a.y<=ytop)flag=true
if(A[0].b.x<=xright&&A[0].b.x>=xleft&&A[0].b.y>=ybottom&&A[0].b.y<=ytop)flag=true
if(i>4&&flag==0)
printf("F\n")
else
printf("T\n")
}
return 0
}