1C. Ancient Berland Circus

现在柏林所有的马戏团都有一个直径13米的圆形竞技场,但过去情况有所不同。

在古代柏林,马戏团的竞技场被塑造成一个规则的(等角的)多边形,大小和角度的数目可能因马戏团而异。竞技场的每一个角落都有一根特别的柱子,柱子之间的绳子标明了竞技场的边缘。

最近,来自柏林的科学家们发现了古老马戏团竞技场的遗迹。他们只发现了三根柱子,其他的都被摧毁了。

给你这三根柱子的坐标。找出竞技场可能拥有的最小区域。

 

输入

输入文件由三行组成,每行包含一对数字-支柱的坐标。任何坐标绝对值不超过1000,小数点后最多6位。

输出

输出古代竞技场的最小可能区域。此数字应精确到小数点后至少6位。保证最优多边形中的角数不大于100。

#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
const double pi = acos(-1.0);
double gcd(double a, double b)
{
    return a < 0.01 ? b : gcd(fmod(b, a), a);
}
int main()
{
    cout << setiosflags(ios::fixed);  //保证setprecision()是设置小数点后的位数。
    //cout << setprecision(8) << pi;
    double a[2], b[2], c[2];
    cin >> a[0] >> a[1];
    cin >> b[0] >> b[1];
    cin >> c[0] >> c[1];
    double ab, ac, bc;
    ab = sqrt(pow(a[0] - b[0], 2) + pow(a[1] - b[1], 2));
    ac = sqrt(pow(a[0] - c[0], 2) + pow(a[1] - c[1], 2));
    bc = sqrt(pow(c[0] - b[0], 2) + pow(c[1] - b[1], 2));
    //海伦公式求面积
    double s, p;
    p = (ab + ac + bc) / 2;
    s = sqrt(p * (p - ab) * (p - ac) * (p - bc));
    //外接圆半径
    double r = ab * bc * ac / (4 * s);
    double m;
    if (bc > ab && bc > ac)
    {
        m = bc;
        bc = ab;
        ab = m;
    }
    if (ac > ab && ac > bc)
    {
        m = ac;
        ac = ab;
        ab = m;
    }
    double a1 = acos((r * r * 2 - bc * bc) / (2.0 * r * r));
    double b1 = acos((r * r * 2 - ac * ac) / (2.0 * r * r));
    double c1 = 2 * pi - a1 - b1;
    double gcda = gcd(gcd(a1, b1), c1);
    //cout <<  gcda<<endl;
    double mins = 0.5 * sin(gcda) * r * r;
    //cout << mins<<endl;
    double S = mins * (2 * pi / gcda);
    cout << setprecision(8) << S << endl;
    //cout << pi;
    return 0;
}

 

posted @ 2021-01-08 00:11  panpm  阅读(82)  评论(0)    收藏  举报