一个关于圆的角度合并的小技巧
一次告诉你三个点,这三个点在一个正多边形上,让你输出最少边数。
因为求圆心角有精度丢失,所以转化成小三角形中其余两个角合,又因为是正n边形,所以就可以转化成那个大角。
当然也可以说是圆心角不好求,可以直接求圆周角,以此类推~~~
#include<cstdio>#include<cmath>#include<string.h>#include<iostream>using namespace std;#define eps 1e-7double exp(double x){ return x<0?-x:x;}double my_fun(double x,double y,double u,double v,double a,double b){ double angle; angle = exp(atan2((v-y),(u-x)) - atan2((b-y),(a-x))); if(angle - 2.0*atan2(1,0) > eps) return angle - 2.0*atan2(1,0); else return angle;}bool judge(double f, int n){ return fabs(f * n - round(f * n)) < eps;}int main(){ char sa[200]; double x1,x2,x3,y1,y2,y3; double j1,j2; int i; while(cin>>x1) { scanf("%lf%lf%lf%lf%lf",&y1,&x2,&y2,&x3,&y3); j1=my_fun(x1,y1,x2,y2,x3,y3)/(2.0*atan2(1,0)); j2=my_fun(x2,y2,x1,y1,x3,y3)/(2.0*atan2(1,0)); for(i=3;i<=1000;i++) { if(judge(j1,i)&&judge(j2,i)) break; } printf("%d\n",i); } return 0;}
浙公网安备 33010602011771号