POJ-4042(简单几何)(Regular Convex Polygon )

来源:互联网 发布:java工程师证书考试 编辑:程序博客网 时间:2024/05/15 16:48
【转载自】http://blog.ac521.org/?p=135&replytocom=24
【题目描述】
给你三个顶点,这三个点是一个正多边形上的顶点,问这个正多边形最少有多少个边?
【解题思路】
三个点,三角形–>外接圆–>必定也是该凸多边形的外接圆-
我们可以把三个点当做一个三角形放在它的外接圆上,然后求出每个角的度(即三角形分的三个弧度所对应的圆周角),设顶点数为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;} 


原创粉丝点击