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; }
浙公网安备 33010602011771号