給定三角形三頂點坐標,這三點是某正多邊形的三個頂點。求該正多邊形的最小可能面積。
R = a*b*c / (4*S)。S 用海倫公式。α = 2 * arcsin(a / (2R)),或用餘弦定理 α = acos(1 - a²/(2R²))。三角和為 2π。gcd(α, β, γ)。對浮點數用 fmod 模擬輾轉相除。S = n * R² * sin(2π/n) / 2 = R² * π * sin(θ) / θ,其中 θ = 基本中心角。#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
struct Pt { double x, y; };
double dist(Pt a, Pt b) {
return hypot(a.x - b.x, a.y - b.y);
}
double fgcd(double a, double b) {
if (fabs(a) < 1e-9) return b;
if (fabs(b) < 1e-9) return a;
return fgcd(b, fmod(a, b));
}
int main() {
Pt p[3];
for (int i = 0; i < 3; ++i) cin >> p[i].x >> p[i].y;
double a = dist(p[0], p[1]);
double b = dist(p[1], p[2]);
double c = dist(p[2], p[0]);
double s = (a + b + c) / 2;
double area = sqrt(s * (s - a) * (s - b) * (s - c));
double R = a * b * c / (4 * area);
double ang[3];
ang[0] = acos(1 - a * a / (2 * R * R));
ang[1] = acos(1 - b * b / (2 * R * R));
ang[2] = 2 * PI - ang[0] - ang[1];
double g = fgcd(ang[0], ang[1]);
g = fgcd(g, ang[2]);
double ans = R * R * PI * sin(g) / g;
printf("%.6f\n", ans);
return 0;
}
R² * π * sin(g) / g。這題將幾何性質(正多邊形頂點在同一圓上,中心角為基本角整數倍)轉化為浮點數 GCD 問題,是計算幾何與數論結合的經典例題。