浮点数真的是日了狗了,我操,
题意:给出n个线段,求是否有一条直线,使得这n个线段在这条直线上的投影 有一个公共点。其实就是问有没有一条直线可以穿过所有的线段,该直线的垂线就是 n个线段的投影线。 TMD沙比的不行啊,浮点数判0 ,要用fabs < eps; `
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
int n;
struct point{
double x,y;
};
struct line{
double a,b,c;
};
struct seg {
point a;
point b;
};
seg data[200]={}; point ans[300]={};
void Coeffcient(line &L,point a,point b) {
L.a = (a.y-b.y);
L.b = (b.x-a.x);
L.c = -L.a*a.x-L.b*a.y;
}
bool jiao(line L,point a,point b) { // 线段ab 在直线L的两侧;
double A = a.x*L.a+a.y*L.b+L.c;
double B = b.x*L.a+b.y*L.b+L.c;
***if(A*B <= 0 || (fabs(A) < 0.00000001 || fabs(B) < 0.00000001)) return 1;***
return 0;
}
bool solve() {
int len = n*2;
for(int i = 0; i < len; i++) {
for(int j = i + 1; j < len; j++) {
line L; Coeffcient(L,ans[i],ans[j]);
bool flag = 1;
if(fabs(ans[i].x-ans[j].x) < 0.00000001 && fabs(ans[i].y-ans[j].y) < 0.00000001)
continue;
for(int k = 0; k < n; k++) {
if(jiao(L,data[k].a,data[k].b))
continue;
else {
flag = 0;
break;
}
}
if(flag) return 1;
}
}
return 0;
}
int main() {
int t;scanf("%d",&t);
while(t--) {
scanf("%d",&n);
int co = 0;
for(int i = 0; i < n; i++) {
scanf("%lf %lf %lf %lf",&data[i].a.x,&data[i].a.y,&data[i].b.x,&data[i].b.y);
ans[co++] = data[i].a;ans[co++] = data[i].b;
}
if(solve()) printf("Yes!\n");
else printf("No!\n");
}
return 0;
}