一个关于圆的角度合并的小技巧
一次告诉你三个点,这三个点在一个正多边形上,让你输出最少边数。
因为求圆心角有精度丢失,所以转化成小三角形中其余两个角合,又因为是正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;
}