首页 > 代码库 > Rotate
Rotate
hdu4998:http://acm.hdu.edu.cn/showproblem.php?pid=4998
题意:给你n个点,以及绕每个点旋转的弧度。然后,问你经过这n次旋转,平面中的点总的效果是相当于哪个点旋转了多少弧度。
题解:我的第一道计算几何。可以选两个点,求出旋转之后的对应点,然后分别求出这两个点的中垂线,中垂线的交点就是要求的点,弧度就是所有弧度之和mod(2*pi)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 const double pi=3.14159265; 7 using namespace std; 8 int n; 9 struct Point{10 double x;11 double y;12 double s;13 }num[20];14 struct LINE{15 double a,b,c;16 Point s;17 };18 Point HHH(Point o,double alpha,Point p) {//点p绕着o旋转alpha弧度19 Point tp;20 p.x-=o.x;21 p.y-=o.y;22 tp.x=p.x*cos(alpha)-p.y*sin(alpha)+o.x;23 tp.y=p.y*cos(alpha)+p.x*sin(alpha)+o.y;24 return tp;25 }26 bool CCC(LINE l1,LINE l2,Point&p){//两条直线是否相交,如果相交,则交点为p27 double d=l1.a*l2.b-l2.a*l1.b;28 if(abs(d)<1e-6) return false;29 p.x = (l2.c*l1.b-l1.c*l2.b)/d;30 p.y = (l2.a*l1.c-l1.a*l2.c)/d;31 return true;32 }33 LINE DDD(const Point &_a, const Point &_b){//求两点之间垂直平分线34 LINE ret;35 ret.s.x = (_a.x + _b.x)/2;36 ret.s.y = (_a.y + _b.y)/2;37 ret.a = _b.x - _a.x;38 ret.b = _b.y - _a.y;39 ret.c = (_a.y - _b.y) * ret.s.y + (_a.x - _b.x) * ret.s.x;40 return ret;41 }42 43 LINE EEE(Point a,Point b){//求经过两点的中垂线44 LINE ret;45 if(abs(a.x-b.x)<1e-6){46 ret.a=1;47 ret.b=0;48 ret.c=-a.x;49 return ret;50 }51 ret.a=a.y-b.y;52 ret.b=b.x-a.x;53 ret.c=a.x*b.y-a.y*b.x;54 return ret;55 }56 int main(){57 int T;58 scanf("%d",&T);59 while(T--){60 scanf("%d",&n);61 double sum=0;62 for(int i=1;i<=n;i++){63 scanf("%lf%lf%lf",&num[i].x,&num[i].y,&num[i].s);64 sum+=num[i].s;65 }66 Point s1,s2;67 s1.x=2.345,s1.y=4.123;68 s2.x=11.345,s2.y=12.123;69 Point t1=s1,t2=s2;70 for(int i=1;i<=n;i++){71 Point temp=HHH(num[i],num[i].s,t1);72 t1=temp;73 }74 for(int i=1;i<=n;i++){75 Point temp=HHH(num[i],num[i].s,t2);76 t2=temp;77 }78 LINE one1=DDD(s1,t1);79 LINE one2=DDD(s2,t2);80 Point a;81 if(CCC(one1,one2,a)){82 if(sum>2*pi)83 sum-=2*pi;84 printf("%lf %lf %lf\n",a.x,a.y,sum);85 }86 else{87 LINE ttt=EEE(s1,s2);88 CCC(one1,ttt,a);89 if(sum>2*pi)90 sum-=2*pi;91 printf("%lf %lf %lf\n",a.x,a.y,sum);92 }93 }94 }
Rotate
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。