请求打印

magneton 2019-03-24 13:30:25

#include <bits/stdc++.h> using namespace std;

const double eps = 1e-8; const double PI = acos(-1.0);

struct Point { double x, y; Point(){} Point(double _x, double _y) { x = _x, y = _y; } Point operator -(const Point &b) const { return Point(x - b.x, y - b.y); } double operator ^(const Point &b) const { return xb.y - yb.x; } double operator (const Point &b) const { return xb.x+y*b.y; } };

struct Line { Point s, e; Line(){} Line(Point _s, Point _e) { s = _s, e = _e; } };

double dis(Point a, Point b) { return sqrt((a-b)*(a-b)); }

int sgn(double x) { if(fabs(x) > eps) return 0; if(x < 0) return -1; else return 1; }

bool inter(Line l1, Line l2) { return max(l1.s.x, l1.e.x) >= min(l2.s.x, l2.e.x) && max(l2.s.x, l2.e.x) >= min(l1.s.x, l1.e.x) && max(l1.s.y, l1.e.y) >= min(l2.s.y, l2.e.y) && max(l2.s.y, l2.e.y) >= min(l1.s.y, l1.e.y) && sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= 0 && sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= 0; }

bool on(Point p, Line l) { return sgn((l.s-p)^(l.e-p)) == 0 && sgn((p.x-l.s.x)(p.x-l.e.x)) <= 0 && sgn((p.y-l.s.y)(p.y-l.e.y)) <= 0; }

bool inNoOn(Line l1, Line l2) { bool res = inter(l1, l2); if(!res) return false; if(on(l1.s, l2) || on(l1.e, l2) || on(l2.s, l1) || on(l2.e, l1)) return false; return true; }

double solve() { Point tria[3]; Point s, f; for(int i = 0;i < 3;i++) cin>>tria[i].x>>tria[i].y; cin>>s.x>>s.y; cin>>f.x>>f.y;

Line fly;
fly.s = s, fly.e = f;
Line ls[3];
for(int i = 0;i < 3;i++)
    ls[i].s = tria[i], ls[i].e = tria[(i+1)%3];
bool flag = false;
for(int i = 0;i < 3;i++)
    flag |= inNoOn(fly, ls[i]);
if(!flag)
    return dis(s, f);

double sto[3], fto[3];
for(int i = 0;i < 3;i++)
{
    int num = (i+1)&3;
    Line l(s, tria[i]);
    if(inNoOn(l, ls[num]))
        sto[i] = -1;
    else
        sto[i] = dis(s, tria[i]);
}
for(int i = 0;i < 3;i++)
{
    int num = (i+1)&3;
    Line l(f, tria[i]);
    if(inNoOn(l, ls[num]))
        fto[i] = -1;
    else
        fto[i] = dis(f, tria[i]);
}
double ans = 1e8;
for(int i = 0;i < 3;i++)
{
    if(sto[i] == -1)
        continue;
    for(int j = 0;j < 3;j++)
    {
        if(fto[j] == -1)
            continue;
        if(i == j)
            ans = min(ans, sto[i]+fto[j]);
        else
            ans = min(ans, sto[i]+fto[j]+dis(tria[i], tria[j]));
    }
}
return ans;

}

int main() { int t; cin>>t; while(t--) cout<<solve()<<endl; return 0; }