【转载自】http://blog.ac521.org/?p=135&replytocom=24
【题目描述】
给你三个顶点,这三个点是一个正多边形上的顶点,问这个正多边形最少有多少个边?
【解题思路】
三个点,三角形–>外接圆–>必定也是该凸多边形的外接圆-
我们可以把三个点当做一个三角形放在它的外接圆上,然后求出每个角的度(即三角形分的三个弧度所对应的圆周角),设顶点数为n,我们只需计算,三角形任意两点所对应的圆心角是否是2PI/n的倍数就可以了、、、并且i很小,可以枚举。
【题目描述】
给你三个顶点,这三个点是一个正多边形上的顶点,问这个正多边形最少有多少个边?
【解题思路】
三个点,三角形–>外接圆–>必定也是该凸多边形的外接圆-
我们可以把三个点当做一个三角形放在它的外接圆上,然后求出每个角的度(即三角形分的三个弧度所对应的圆周角),设顶点数为n,我们只需计算,三角形任意两点所对应的圆心角是否是2PI/n的倍数就可以了、、、并且i很小,可以枚举。
在计算圆心角是否是2PI/n的倍数的时候,有一个小技巧,具体看代码
bool zero(double n)
{
return n < EPS && n > -EPS;
}
double dis(double x1, double y1, double x2, double y2)
{
return sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
}
double angle(double a, double b, double c)
{
return acos((a * a + b * b - c * c) / (2 * a * b));
}
bool check(double n)
{
return zero(n-(int)(n + 0.5));
}
int main()
{
double x[3], y[3], a, b, c, A, B, C;
while (scanf("%lf%lf", &x[0], &y[0]) ) {
scanf("%lf%lf", &x[1], &y[1]);
scanf("%lf%lf", &x[2], &y[2]);
a = dis(x[0], y[0], x[1], y[1]);
b = dis(x[1], y[1], x[2], y[2]);
c = dis(x[2], y[2], x[0], y[0]);
A = angle(a, b, c) / MY_PI;
B = angle(b, c, a) / MY_PI;
C = angle(c, a, b) / MY_PI;
int i;
for (i = 3; i <= 1000; i++)
if (check(A * i) && check(B * i) && check(C * i))
break;
cout<<i<<endl;
}
return 0;
}
本文介绍了一种计算包含特定三点的最小正多边形边数的方法。通过计算三点形成的三角形各边长度及对应圆心角,并验证这些角是否能被2π/n整除来确定正多边形的边数。
(Regular Convex Polygon )&spm=1001.2101.3001.5002&articleId=7473423&d=1&t=3&u=4aaff6d4a43e4a26bc8ecdad51f0a379)
763

被折叠的 条评论
为什么被折叠?



