一个关于圆的角度合并的小技巧

一次告诉你三个点,这三个点在一个正多边形上,让你输出最少边数。

因为求圆心角有精度丢失,所以转化成小三角形中其余两个角合,又因为是正n边形,所以就可以转化成那个大角。

当然也可以说是圆心角不好求,可以直接求圆周角,以此类推~~~

#include<cstdio>
#include<cmath>
#include<string.h>
#include<iostream>
using namespace std;
#define eps 1e-7
double 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;
}

posted on 2016-04-17 20:36  very_czy  阅读(477)  评论(0编辑  收藏  举报

导航