Ancient Berland Circus
1.根据海伦公式求出三角形面积
2.根据正弦定理求出三角形外接圆半径
3.根据比例关系求出正多边形最小的外角
4.输出答案
注意求第三个角的时候用2 * pi减去另两个角,否则误差过大
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <string>
using namespace std;
const double pi = acos(-1.0);
const double eps = 1e-2;
struct Node
{
double x, y;
}node[4];
double area(double a, double b, double c)
{
double p = (a + b + c) / 2.0;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
double mul(double x)
{
return x * x;
}
double dist(int i, int j)
{
return sqrt(mul(node[i].x - node[j].x) + mul(node[i].y - node[j].y));
}
bool feq(double x)
{
return fabs(x) < eps ? true : false;
}
double fgcd(double a, double b)
{
if (feq(b))
{
return a;
}
if (feq(a))
{
return b;
}
return fgcd(b, fmod(a, b));
}
void input()
{
int t = 0;
while (scanf("%lf %lf", &node[t].x, &node[t].y) != EOF)
{
t++;
if (t == 3)
{
double a = dist(0, 1), b = dist(0, 2), c = dist(1, 2);
double r = a * b * c / (4 * area(a, b, c)); //求外接圆半径
double p = asin(a / 2 / r) * 2, q = asin(b / 2 / r) * 2;
double m = 2 * pi - p - q; //求三边对应的圆心角
double flag = fgcd(q, m); //求最小角度
double temp = fgcd(p, flag);
printf("%.6lf\n", pi * 2 / temp * 0.5 * r * r * sin(temp));
}
}
}
int main()
{
input();
return 0;
}