HDU 4195

来源:互联网 发布:商务通弹窗js代码 编辑:程序博客网 时间:2024/06/16 10:04

一道计算几何,表示一开始一点思路都没有,看了别人的思路以后才下手写的,但是圆心角都不会求了,这就相当尴尬了。。。然后去普及了一下。。。

//思路:三个点,三角形–>外接圆–>必定也是该凸多边形的外接圆-//我们可以把三个点当做一个三角形放在它的外接圆上,然后求出每个角的度(即三角形分的三个弧度所对应的圆周角)//三角形的圆心角可以整除(2*pi)/n//,设顶点数为n,我们只需计算,三角形任意两点所对应的圆心角是否是2PI/n的倍数就可以了,并且i很小,可以枚举。#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<algorithm>#define EPS 1e-6#define PI acos(-1)using namespace std;const int maxn = 1024;double dist[3],angle[3];double point[3][2];double cal_dist(int i,int j)//计算两边的距离{    return sqrt((point[i][0] - point[j][0])*(point[i][0] - point[j][0])+(point[i][1] - point[j][1])*(point[i][1] - point[j][1]));}double cal_angle(int i,int j,int k){    return acos((dist[i]*dist[i]+dist[j]*dist[j]-dist[k]*dist[k])/(2.0*dist[i]*dist[j]));}//计算角度,这里用了余弦定理cos(s) = (a*a+b*b - c*c)/(2*a*b);利用圆周角定理,既然三角形上的三个点都在外接圆上,那么圆心角就是圆周角的两倍。bool ok(double x){    return fabs(x - int(x+0.05)) < EPS;}int main(){    int i;    while(scanf("%lf%lf",&point[0][0],&point[0][1])==2)    {        scanf("%lf%lf%lf%lf",&point[1][0],&point[1][1],&point[2][0],&point[2][1]);        dist[0] = cal_dist(0,1);        dist[1] = cal_dist(1,2);        dist[2] = cal_dist(2,0);                angle[0] = cal_angle(0,1,2)/PI;        angle[1] = cal_angle(1,2,0)/PI;        angle[2] = cal_angle(2,0,1)/PI;        int i;        for(i = 3;i <= 1000;i++)        {            if(ok(angle[0]*i)&&ok(angle[1]*i)&&ok(angle[2]*i))                break;        }        printf("%d\n",i);    }}


0 0
原创粉丝点击