UVALive - 8295 Triangle to Hexagon

The meaning of the title: is to find the distance of each side of the hexagon inside

Ideas: Just ask directly (reverse the order of the title numbers, bless your teammates not to kill)

Code:

#include <set>
#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <vector>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define zero(a) fabs(a)<eps
#define max( x, y )  ( ((x) > (y)) ? (x) : (y) )
#define min( x, y )  ( ((x) < (y)) ? (x) :(y) )
#define lowbit(x) (x&(-x))
#define debug(a) cerr<<#a<<"=="<<a<<endl
typedef long long LL;
const long double pi=acos(-1.0);
const long double eps=1e-8;
const int inf=0x3f3f3f3f;
const LL linf=0x3f3f3f3f3f3f3f3f;
using namespace std;

#define zero(x) (((x)>0?(x):-(x))<eps)
int sgn(long double x)
{
    if(fabs(x) < eps)return 0;
    if(x < 0)return -1;
    else return 1;
}
struct point
{
    long double x,y;
    point (){}
    point (long double _x,long double _y)
    {
        x =_x,y= _y;
    }
};
struct Line
{
    point a,b;
    Line(){}
    Line(point _a,point _b)
    {
        a=_a;
        b=_b;
    }
};
struct circle {
    point o;
    long double r;
    void print() {
        printf(" center:(%.4Lf, %.4Lf) rad: %.4Lf\n", o.x, o.y, r);
    }
};
long double xmult(point p1,point p2,point p0)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
point intersection(point u1,point u2,point v1,point v2)
{
    point ret=u1;
    long double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
             /((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
    ret.x+=(u2.x-u1.x)*t;
    ret.y +=(u2.y-u1.y)* t;
    return ret;
}
point intersection(Line u,Line v)
{
    point ret=u.a;
    long double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))
             /((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
    ret.x+=(u.b.x-u.a.x)*t;
    ret.y+=(u.b.y-u.a.y)*t;
    return ret;
}
long double dist(point a,point b)
{
    return (long double)sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
point circumcenter(point a,point b,point c)
{
    Line u,v;
    u.a.x=(a.x+b.x)/2;
    uay =(a.y+by)/ 2 ;
    u.b.x=u.a.x-a.y+b.y;
    u.b.y=u.a.y+a.x-b.x;
    v.a.x=(a.x+c.x)/2;
    go =( a.y +cy)/ 2 ;
    v.b.x=v.a.x-a.y+c.y;
    v.b.y=v.a.y+a.x-c.x;
    return intersection(u,v);
}
point incenter(point a,point b,point c)
{
    Line u,v;
    long double m,n;
    u.a=a;
    m=atan2(b.y-a.y,b.x-a.x);
    n =atan2(cy-ay,cx- ax);
    u.b.x=u.a.x+cos((m+n)/2);
    uby =uay+sin((m+n)/ 2 );
    v.a=b;
    m=atan2(a.y-b.y,a.x-b.x);
    n = atan2 (cy-by, cx- bx);
    v.b.x=v.a.x+cos((m+n)/2);
    v.b.y=v.a.y+sin((m+n)/2);
    return intersection(u,v);
}
circle getNqc(point a, point b, point c) {
    long double C = dist(a, b);
    long double B = dist(a, c);
    long double A = dist(b, c);
    circle cir;
    cir.o.x = (A*a.x + B*b.x + C*c.x) / (A + B + C);
    cir.oy = (A*ay + B*by + C*cy) / (A + B + C);
    cir.r = sqrt((A + B - C)*(A - B + C)*(-A + B + C) / (A + B + C)) / 2;
    return cir;
}
void intersection_line_circle(point c,long double r,point l1,point l2,point& p1,point& p2)
{
    point p=c;
    long double t;
    px +=l1.y- l2.y;
    py +=l2.x- l1.x;
    p=intersection(p,c,l1,l2);
    t=sqrt(r*r-dist(p,c)*dist(p,c))/dist(l1,l2);
    p1.x=p.x+(l2.x-l1.x)*t;
    p1.y =p.y+(l2.y-l1.y)* t;
    p2.x=p.x-(l2.x-l1.x)*t;
    p2.y =py-(l2.y-l1.y)* t;
}
Line line[10];

intmain ()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int p;
        long double t1,t2,t3;
        point A,B,C,I,P,N,M;
        cin>>p>>t1>>t2>>t3;
        A=point(0.0,0.0),B=point(t1,0),C=point(t2,t3);
        circle qwe=getNqc(A,B,C);
        I = qwe.o;
        point wo=circumcenter(A,B,C);

        long double wr=dist(A,wo);
        point a1,a2;
        intersection_line_circle(wo,wr,I,A,a1,a2);
        if(fabs(a1.x-A.x)<eps&&fabs(a1.y-A.y)<eps){
            M=a2;
        }
        else{
            M=a1;
        }
        intersection_line_circle(wo,wr,I,B,a1,a2);
        if(fabs(a1.x-B.x)<eps&&fabs(a1.y-B.y)<eps){
            N=a2;
        }
        else{
            N=a1;
        }
        intersection_line_circle(wo,wr,I,C,a1,a2);
        if(fabs(a1.x-C.x)<eps&&fabs(a1.y-C.y)<eps){
            P=a2;
        }
        else{
            P=a1;
        }
        point E,F,K,J,H,G;
        G=intersection(Line(A,C),Line(M,N));
        H=intersection(Line(M,N),Line(C,B));
        J=intersection(Line(C,B),Line(M,P));
        K=intersection(Line(M,P),Line(A,B));
        E=intersection(Line(A,B),Line(N,P));
        F=intersection(Line(N,P),Line(A,C));
        printf("%d %.4Lf %.4Lf %.4Lf %.4Lf %.4Lf %.4Lf\n",p,dist(E,F),dist(F,G),dist(G,H),dist(H,J),dist(J,K),dist(K,E));
    }
    return 0;
}
/*

3
1 3 2.5 3

1
1 2 1 1.732
*/

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325309034&siteId=291194637