hdu4998 Rotate(计算几何+模拟)

来源:互联网 发布:ipsec dh算法 编辑:程序博客网 时间:2024/06/08 16:08

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4998

题目大意:

n次旋转,每一次以(x,y)为中心点旋转弧度p。问最终旋转的效果相当于是围绕哪个点旋转弧度P?

输出这个点坐标以及旋转的弧度P

解:

这题就是模拟做的,因为数据量不大。模拟做就是写起来麻烦。

因为用的旋转模板是逆时针旋转,但最后求的P是在三角形里求解出来的,这样的P一定小于π,如果旋转角大于π需要判定下。

(和队友各种整才整过,菜~~)

代码:

#include <bits/stdc++.h>const double pi = acos (-1.0);const double eps=1e-6;using namespace std;struct Point{    double x,y,b;    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 x*b.y-y*b.x;    }    void trans(double B)    {        double tx=x,ty=y;        x=tx*cos(B)-ty*sin(B);        y=tx*sin(B)+ty*cos(B);    }}a[15];void zhuan(Point &A,Point &B,double b){    A.x-=B.x;    A.y-=B.y;    A.trans(b);    A.x+=B.x;    A.y+=B.y;}Point AA(101,100),BB(101,1),CC(0,101);struct Line{    Point s,e;    Line(){}    Line(Point _s,Point _e)    {        s=_s;e=_e;    }    pair<int,Point> operator &(const Line &b)const{    Point res=s;    double t=((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));    res.x+=(e.x-s.x)*t;    res.y+=(e.y-s.y)*t;    return make_pair(2,res);    }};double dist(Point A,Point B){    return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}double qiuhudu(Point C,Point ans1,Point CC){    double a=dist(C,ans1);    double b=dist(CC,ans1);    double c=dist(C,CC);    double ans=(a*a+b*b-c*c)/2/a/b;    return acos(ans);}int main(){     int t,n;     scanf("%d",&t);     while(t--)     {         scanf("%d",&n);         Point A(101,100),B(101,1),C(0,101);         for(int i=0;i<n;i++)         {             scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].b);             zhuan(A,a[i],a[i].b);             zhuan(B,a[i],a[i].b);             zhuan(C,a[i],a[i].b);         }         Point mid1((A.x+AA.x)/2,(A.y+AA.y)/2);         Point mid2((B.x+BB.x)/2,(B.y+BB.y)/2);         zhuan(A,mid1,pi/2);         Line A1(A,mid1);         zhuan(B,mid2,pi/2);         Line A2(B,mid2);        pair<int,Point>s=A1&A2;        Point ans1(s.second.x,s.second.y);        double ans2=qiuhudu(C,ans1,CC);//cout<<"qiude ="<<ans2<<" ";        //cout<<ans2<<endl;        Point temp(CC.x,CC.y);        zhuan(temp,ans1,ans2);        if(fabs(temp.x-C.x)>eps||fabs(temp.y-C.y)>eps)            ans2=2*pi-ans2;            /*cout<<"CC"<<CC.x<<" "<<CC.y<<endl;            cout<<"C"<<C.x<<" "<<C.y<<endl;            cout<<"temp"<<temp.x<<" "<<temp.y<<endl;*/        printf("%.10f %.10f %.10f\n",s.second.x,s.second.y,ans2);     }    return 0;}


原创粉丝点击