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