『8.20 模擬賽』旋轉的多邊形
阿新 • • 發佈:2018-08-20
reg https size 兩個 -m () include ont +=
題目鏈接戳著裏!!
題目描述
解題思路
顯然,多邊形滾動的時候,指定的點一定是繞著某一個頂點旋轉的,旋轉的半徑就是點到頂點的距離,角度就是頂點所在腳的外角。
如下圖所示:
那麽我們的問題就轉化成了求dis和θ了。
dis很簡單,只要勾股定理就好了。
那θ呢?也很簡單嘍,只要鏈接當前頂點的相鄰的兩個頂點,運用余弦定理求就好啦,註意一下角度值和弧度制就可以了。
(不會余弦定理的小夥伴戳這裏==> Wikipedia & 百度百科)
代碼
1 #include<iostream> 2 #include<cstdio> 3#include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 const double PI=acos(-1.0); 8 struct nod{ 9 int x,y; 10 double dis,deg; 11 }; 12 int n,xq,yq; 13 nod p[100]; 14 double ans; 15 inline double gougu(int x1,int y1,int x2,int y2){16 return (double)sqrt((double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))); 17 } 18 inline double yuxian(double dis1,double dis2,double dis3){ 19 double cosc=(dis2*dis2+dis3*dis3-dis1*dis1)/(2*dis2*dis3); 20 cosc=acos(cosc); 21 cosc=cosc*180.0/PI; 22 return cosc; 23 } 24 inline void calc_dis(){25 for(register int i=1;i<=n;i++){ 26 p[i].dis=gougu(xq,yq,p[i].x,p[i].y); 27 } 28 } 29 inline void calc_deg(){ 30 for(register int i=1;i<=n;i++){ 31 int la=i-1,ne=i+1; 32 if(la==0)la=n; 33 if(ne==n+1)ne=1; 34 double dis1=gougu(p[la].x,p[la].y,p[ne].x,p[ne].y); 35 double dis2=gougu(p[la].x,p[la].y,p[i].x,p[i].y); 36 double dis3=gougu(p[i].x,p[i].y,p[ne].x,p[ne].y); 37 p[i].deg=yuxian(dis1,dis2,dis3); 38 } 39 } 40 inline void calc(){ 41 for(register int i=1;i<=n;i++){ 42 ans+=2.0*PI*p[i].dis*((180.0-p[i].deg)/360.0); 43 } 44 } 45 int main(){ 46 scanf("%d",&n); 47 for(register int i=1;i<=n;i++){ 48 scanf("%d%d",&p[i].x,&p[i].y); 49 } 50 scanf("%d%d",&xq,&yq); 51 calc_dis(); 52 calc_deg(); 53 calc(); 54 printf("%.3f\n",ans); 55 }
『8.20 模擬賽』旋轉的多邊形