ICPC NEAU Programming Contest 2020 桌球 (计算几何)

在这里插入图片描述

思路:
在这里插入图片描述
你可以求出白球要移动到哪个点,同时白球和红球分别在红线两边才可能进行移动。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>using namespace std;const int maxn = 4e5 + 7;
const double PI = acos(-1);
const double eps = 1e-6;int sign(double x) {if(x > 0) return 1;else if(x < 0) return -1;else return 0;
}double Get(double x,double y,double nx,double ny,double k) {return k * x - y + ny - k * nx;
}int main() {int T;scanf("%d",&T);while(T--) {double wx,wy,rx,ry,hx,hy;scanf("%lf%lf%lf%lf%lf%lf",&wx,&wy,&rx,&ry,&hx,&hy);double k1 = (hy - ry) / (hx - rx);double deg1 = atan2(ry - hy,rx - hx);double nx,ny;nx = rx + 2 * cos(deg1);ny = ry + 2 * sin(deg1);double k2 = -1.0 / k1;if(sign(Get(wx,wy,nx,ny,k2)) == sign(Get(rx,ry,nx,ny,k2))) {printf("Impossible\n");}else {double ans = atan2(ny - wy,nx - wx);if(ans < 0) ans += 2 * PI;printf("%.6f\n",ans / PI);}}return 0;
}