hdu 1700 Points on Cycle 水幾何

來源:互聯網
上載者:User

標籤:blog   2014   os   name   c   line   

已知圓心(0,0)圓周上的一點,求圓周上另外兩點使得三點構成等邊三角形。

懶得推公式,直接用模板2圓(r1=dist,r2=sqrt(3)*dist)相交水過

#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<iterator>using namespace std;#define eps 1e-6typedef long long ll;inline double sqr(double x){    return x*x;}int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}int sig(double x){    if(fabs(x)<eps) return 0;    if(x>0) return 1;    return -1;}struct point{    double x,y;    point(){};    point(double a,double b):x(a),y(b){}    void input()    {        scanf("%lf%lf",&x,&y);    }    friend point operator + (const point &a,const point &b)    {        return point(a.x+b.x,a.y+b.y);    }    friend point operator - (const point &a,const point &b)    {        return point(a.x-b.x,a.y-b.y);    }    friend bool operator == (const point &a,const point &b)    {        return sig(a.x-b.x)==0 && sig(a.y-b.y)==0;    }    friend point operator * (const point &a,const double &b)    {        return point(a.x*b,a.y*b);    }    friend point operator * (const double &a,const point &b)    {        return point(a*b.x,a*b.y);    }    friend point operator / (const point &a,const double &b)    {        return point(a.x/b,a.y/b);    }    double norm()    {        return sqrt(sqr(x)+sqr(y));    }}a,b;double det(const point &a,const point &b){    return a.x*b.y-a.y*b.x;}double dot(const point &a,const point &b){    return a.x*b.x+a.y*b.y;}double dist(const point &a,const point &b){    return (a-b).norm();}point rotate_point(const point &p,double A){    double tx=p.x,ty=p.y;    return point(tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));}point rotate(const point &p,double cost,double sint){    double x=p.x,y=p.y;    return point(x*cost-y*sint,x*sint+y*cost);}pair<point,point> crosspoint(point ap,double ar,point bp,double br){    double d=(ap-bp).norm();    double cost=(ar*ar+d*d-br*br)/(2*ar*d);    double sint=sqrt(1.0-cost*cost);    point v=(bp-ap)/(bp-ap).norm()*ar;    return make_pair(ap+rotate(v,cost,-sint),ap+rotate(v,cost,sint));}int main(){    int cas;b.x=0;b.y=0;    scanf("%d",&cas);    while(cas--)    {        a.input();        double r=dist(a,b);        pair<point,point> ans=crosspoint(b,r,a,sqrt(3.0)*r);        double x1=ans.first.x,y1=ans.first.y,x2=ans.second.x,y2=ans.second.y;        if(y1<y2||y1==y2&&x1<x2) printf("%.3lf %.3lf %.3lf %.3lf\n",x1,y1,x2,y2);        else printf("%.3lf %.3lf %.3lf %.3lf\n",x2,y2,x1,y1);    }    return 0;}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.