知识点:线段与直线相交,注意枚举时重合点的处理
#include<iostream>
#include<math.h>
using namespace std;
#define esp 1e-8
struct Point {
double x,y;
Point(){}
Point(double x0,double y0):x(x0),y(y0){}
};
/*bool isEqual(double &a,double &b){
return fabs(a-b)<esp;
}*/
double mult(Point st,Point ed,Point md){//叉积判断点在直线的左右位置,<0,左侧,>0右侧!
return ((st.x-md.x)*(ed.y-md.y)-(ed.x-md.x)*(st.y-md.y));
}
Point p[402];
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=2*n;i+=2)
scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i+1].x,&p[i+1].y);
bool f=false,f2;
for(int i=1;i<=2*n;i++)
{ for(int j=i+1;j<=2*n;j++)
{ if(p[i].x!=p[j].x||p[i].y!=p[j].y)
{ f=true;
for(int g=1;g<=2*n;g+=2)
{ if(mult(p[g],p[i],p[j])*mult(p[g+1],p[i],p[j])>esp)//判断两线段是否有交点,>0无交点!!
{ f=false;
break;
}
}
if(f) break;
}
} if(f) break;
}
if(f) printf("Yes!\n");
else printf("No!\n");
}
}