Noting is more interesting than rotation!
Your little sister likes to rotate things. To put it easier to analyze, your sister makes n rotations. In the i-th time, she makes everything in the plane rotate counter-clockwisely around a point ai by a radian of pi.
Now she promises that the total effect of her rotations is a single rotation around a point A by radian P (this means the sum of pi is not a multiplier of 2π).
Of course, you should be able to figure out what is A and P :).
计算几何


1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<cmath>
6 using namespace std;
7 const double eps=1e-8;
8 const double pi=acos(-1.0);
9
10 int sgn(double x){
11 if(fabs(x)<eps) return 0;
12 if(x<0) return -1;
13 else return 1;
14 }
15
16 struct Point{
17 double x,y;
18 Point(){}
19 Point(double _x,double _y){
20 x=_x;
21 y=_y;
22 }
23 Point operator -(const Point &b)const{
24 return Point(x-b.x,y-b.y);
25 }
26 double operator ^(const Point &b)const{
27 return x*b.y-y*b.x;
28 }
29 double operator *(const Point &b)const{
30 return x*b.x+y*b.y;
31 }
32 Point operator +(const Point &b)const{
33 return Point(x+b.x,y+b.y);
34 }
35 Point operator *(const double &k)const{
36 return Point(x*k,y*k);
37 }
38 Point operator /(const double &k)const{
39 return Point(x/k,y/k);
40 }
41 Point rotate(Point p,double angle){
42 Point v=(*this)-p;
43 double c=cos(angle),s=sin(angle);
44 return Point(p.x+v.x*c-v.y*s,p.y+v.x*s+v.y*c);
45 }
46 double len2(){
47 return x*x+y*y;
48 }
49 };
50
51 struct Line{
52 Point s,e;
53 Line(){}
54 Line(Point _s,Point _e){
55 s=_s;
56 e=_e;
57 }
58 Point crosspoint(Line v){
59 double a1=(v.e-v.s)^(s-v.s);
60 double a2=(v.e-v.s)^(e-v.s);
61 return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));
62 }
63 Point lineprog(Point p){
64 return s+( ((e-s)*((e-s)*(p-s)))/((e-s).len2()) );
65 }
66 };
67
68 void solve(){
69 int n,i;
70 double x,y,p,nx,ny,np;
71 Point a,b,c,d,e,f,g;
72 Line l1,l2,l3,l4;
73 scanf("%d",&n);
74 scanf("%lf%lf%lf",&nx,&ny,&np);
75 for(i=2;i<=n;i++){
76 scanf("%lf%lf%lf",&x,&y,&p);
77 a=Point(nx,ny);b=Point(x,y);
78 d=a.rotate(b,p);c=b.rotate(a,-np);
79 l1=Line(c,b);l2=Line(a,d);
80 e=l1.lineprog(a);f=l2.lineprog(b);
81 l3=Line(a,e);l4=Line(b,f);
82 g=l3.crosspoint(l4);
83 nx=g.x;ny=g.y;
84 np=np+p;
85 if(np>2*pi) np-=2*pi;
86 }
87 printf("%lf %lf %lf\n",nx,ny,np);
88 }
89
90 int main(){
91 int t;
92 scanf("%d",&t);
93 while(t)solve();
94 return 0;
95 }