1. 程式人生 > >『8.20 模擬賽』旋轉的多邊形

『8.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 模擬賽』旋轉的多邊形