HDU 4195

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

//思路:三个点,三角形–>外接圆–>必定也是该凸多边形的外接圆-
//我们可以把三个点当做一个三角形放在它的外接圆上,然后求出每个角的度(即三角形分的三个弧度所对应的圆周角)
//三角形的圆心角可以整除(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值