题目链接 codeforces 1C
题意:给出3个点,然后求包含这三个点的最小正多边形的面积
题解
正多边形是指二维平面内各边相等,各角也相等的多边形。
仔细分析,这个正多边形并不是由多个给定的三角形构成,而是只需包含这个三角形即可
这个三角形和正多边形外接同一个圆,找出外接圆的半径,再求出三个圆心角,易得这个多边形的边所对应的圆心角可被这三个圆心角整除,所以三个圆心角的gcd就是多边形边所对的圆心角,然后2π除一下就得到是几边形
1.三角形面积公式
p = (a + b + c) / 2;
S = sqrt(p * (p - a) * (p - b) * (p - c));
2.求外接圆半径
R = a * b * c / (4 * S);
// a b c 代表三角形三条边长度
// S 代表三角形面积
3.求圆心角
double angle(double a, double b, double c){
return acos((a * a + b * b - c * c) / (2 * a * b));
}
// 角C所对的圆心角
4.double 类型的最小公倍数
double fgcd(double a, double b){
if(b <= eps) return a;
else return fgcd(b, fmod(a, b));
}
5.求多边形的边数
PI = atan2(0, -1); // PI 在数学上的表示
n = PI / fgcd(fgcd(A, B), C); // 求多边形的边数
6.多边形的面积公式
ans = n / 2 * R * R * sin(2 * PI / n);
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const double eps = 1e-4;
double len(double x, double y, double a, double b){ // 求两边之间距离
return sqrt((b-y)*(b-y) + (a-x)*(a-x));
}
double angle(double a, double b, double c){ // 求角度
return acos((a * a + b * b - c * c) / (2 * a * b));
}
double fgcd(double a, double b){ // double 类型的最小公倍数
if(b <= eps) return a;
else return fgcd(b, fmod(a, b));
}
int main(){
double x1, y1, x2, y2, x3, y3;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
double a = len(x1, y1, x2, y2);
double b = len(x3, y3, x2, y2);
double c = len(x1, y1, x3, y3);
double p = (a + b + c) / 2;
double S = sqrt(p * (p - a) * (p - b) * (p - c)); // 三角形面积
double R = a * b * c / (4 * S);
double A = angle(b, c, a);
double B = angle(a, c, b);
double C = angle(a, b, c);
double PI = atan2(0, -1); // PI 的值
double n = PI / fgcd(fgcd(A, B), C); // 多边形边数
double ans = n / 2 * R * R * sin(2 * PI / n); // 多边形面积公式
printf("%.12f\n", ans);
return 0;
}