hdu4998 Rotate(计算几何+模拟)

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值