实在查不出来了,蹲个dalao吧。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct Point{
double x,y;
Point operator + (const Point pp){return Point{x+pp.x,y+pp.y};};
Point operator - (const Point pp){return Point{x-pp.x,y-pp.y};};
Point operator / (const double k){return Point{x/k,y/k};};
double operator * (const Point pp){return x*pp.y-y*pp.x;};
}p[2][4];
int T;
inline bool check(Point a,Point b){
Point c = b-a;
if (c*(p[0][0]-a) > 0){
for (int i=1;i<4;++i) if (c*(p[0][i]-a) <= 0) return false;
for (int i=0;i<4;++i) if (c*(p[1][i]-a) >= 0) return false;
}else if (c*(p[0][0]-a) < 0){
for (int i=1;i<4;++i) if (c*(p[0][i]-a) >= 0) return false;
for (int i=0;i<4;++i) if (c*(p[1][i]-a) <= 0) return false;
}else return false;
return true;
}
inline void solve(){
for (int i=0;i<2;++i) for (int j=0;j<4;++j) scanf("%lf%lf",&p[i][j].x,&p[i][j].y);
double xi,yi,xj,yj;
for (int i=0;i<2;++i){
for (int j=0;j<4;++j){
xi = p[i][(j+1)%4].x+1e-6, yi = p[i][(j+1)%4].y;
xj = p[i][j].x+1e-6, yj = p[i][j].y;
if (check(Point{xi,yi},Point{xj,yj})){
printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
return;
}
xi = p[i][(j+1)%4].x-1e-6, yi = p[i][(j+1)%4].y;
xj = p[i][j].x-1e-6, yj = p[i][j].y;
if (check(Point{xi,yi},Point{xj,yj})){
printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
return;
}
xi = p[i][(j+1)%4].x, yi = p[i][(j+1)%4].y+1e-6;
xj = p[i][j].x, yj = p[i][j].y+1e-6;
if (check(Point{xi,yi},Point{xj,yj})){
printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
return;
}
xi = p[i][(j+1)%4].x, yi = p[i][(j+1)%4].y-1e-6;
xj = p[i][j].x, yj = p[i][j].y-1e-6;
if (check(Point{xi,yi},Point{xj,yj})){
printf("%.10lf %.10lf %.10lf\n",yi-yj,xj-xi,xj*yi-xi*yj);
return;
}
}
}
}
int main(){
scanf("%d",&T);
while (T--) solve();
return 0;
}