题目大意
给出多边形的三个顶点,求多边形最小面积。
解题思路
众所周知,这是一道计算几何题。
- 很明显,正多边形的顶点肯定都在这三个顶点构成三角形的外接圆上;
- 首先,我们可以求出外接圆的半径;
- 然后,根据求出三角形的三个角,和对应圆心角;
- 最后,枚举 3 − 100 3-100 3−100边形,依次判断即可。
需要用到的芝士:
- 海伦公式 S = p ( p − a ) ( p − b ) ( p − c ) ( p = a + b + c 2 ) S=\sqrt {p(p-a)(p-b)(p-c)} \left( p=\frac{a+b+c}{2}\right) S=p(p−a)(p−b)(p−c)(p=2a+b+c);
- 正多边形面积公式 S = n R 2 s i n A 2 S=\frac{nR^2sinA}{2} S=2nR2sinA。
代码实现
#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
struct node {
double x, y;
} a[3];
double dis(node A, node B) {
return sqrt((A.x - B.x) * (A.x - B.x)+(A.y - B.y) * (A.y - B.y));
}
double cos(double a, double b, double c) {
return acos((a * a + b * b - c * c) / (2 * a * b));
}
double area(double a, double b, double c) { // 计算R
double p = (a + b + c) / 2;
return a * b * c / 4 / sqrt(p * (p - a) * (p - b) * (p - c));
}
bool check(double x) { // 判断一个数是否为实数
return fabs(x - (int)(x + 0.05)) < 1e-4;
}
// l: 三角形三边长度
// angle: 三角形三个角的角度
double l[3], angle[3];
int main() {
for (int i = 0; i < 3; ++i) {
cin >> a[i].x >> a[i].y;
}
l[0] = dis(a[0], a[1]);
l[1] = dis(a[0], a[2]);
l[2] = dis(a[1], a[2]);
angle[0] = cos(l[1], l[2], l[0]) / pi;
angle[1] = cos(l[0], l[2], l[1]) / pi;
angle[2] = cos(l[0], l[1], l[2]) / pi;
for (int i = 3; i <= 100; ++i) {
if (check(angle[0] * i) && check(angle[1] * i) && check(angle[2] * i)) {
cout << fixed << setprecision(6) << i * pow(area(l[0], l[1], l[2]), 2) * sin(2 * pi / i) / 2 << '\n';
break;
}
}
return 0;
}
Goodbye,大家明天(可能是今天,可能是后天,可能是 n ( n ∈ Z ) n(n \in Z) n(n∈Z)天后)再见鸭~