@994495jj
2017-08-23T01:12:08.000000Z
字数 1143
阅读 750
201708 (ACM)计算几何----圆反演
#include<bits/stdc++.h>using namespace std;#define fi first#define se second#define pb push_back#define sz(a) (int)a.size()#define mp make_pair#define rep(i, a, b) for(int i=(a); i<(b); i++)#define de(a) cout<<#a<<"="<<a<<endl;typedef long long ll;typedef double db;typedef pair<int, int> pii;typedef vector<int> vi;//--------const db eps = 1e-8;int sign(db x) {return (x > eps) - (x < -eps);}db r;struct P {db x,y;P() {}P(db x,db y) {this -> x = x;this -> y = y;}P operator + (const P &c) const {return P(x + c.x, y + c.y);}P operator - (const P &c) const {return P(x - c.x, y - c.y);}P operator * (const db &c) const {return P(x * c, y * c);}P operator / (const db &c) const {return P(x / c, y / c);}};P read() {db x,y;scanf("%lf%lf",&x,&y);return P(x,y);}db dis(P a) {return sqrt(a.x*a.x+a.y*a.y);}db dis(P a, P b) {return dis(a - b);}P fanyan(P a) {db d = dis(a);db t = r * r / d / d;return a * t;}int main() {int T;scanf("%d", &T);while(T--) {scanf("%lf", &r);P a = read(), b = read();if(sign(dis(a)) <= 0) {printf("%.7f\n", r*2.0);continue;}P _a = fanyan(a), _b = fanyan(b);db d = dis((_a + _b) / 2);db ans = 0;if(sign(d - r) > 0) {P p1 = (a + b) / 2;db t = r / dis(p1);p1 = p1 * t;ans = dis(p1, a) * 2;} else {ans = dis(_a - _b);ans = ans * dis(a) / r;}printf("%.7f\n",ans);}return 0;}
