【1C. Ancient Berland Circus】 【立体几何】
三角形面积的几种求法: 1、s=(1/2)*底*高 =(1/4)√[(a+b+c)(a+b-c)(a+c-b)(b+c-a)] 5、三角形面积=abc/4R(其中R是三角形外接圆半径) 6、S = 叉积/2,叉积公式: |
已知一个斗兽场是一个正多边形(边数最多是100),给我们三个点,求这个斗兽场的最小面积。输入均为有效值。
思路:
因为是正n边形,所以S = N*(R*R*sin(x)/2),R是正n边形外接圆的半径。
由上面的公式2跟公式5可以求出R
设三角形的三条边对应的圆心角分别是:A、B、C(圆心角很好求,比如 A = acos(R*R+R*R-a*a)/(2*R*R))
x = gcd(A,B,C), n = 2*π/x
求浮点数的gcd,需要用到fmod函数,这里的fgcd需要设置一个eps,eps=1e-2才行(当然eps=-3、-4都是可以的)
|
【(⊙o⊙)…老了老了,简单的计算几何都不会了...】
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-2;
const double pai = acos(-1.0);
double gcd(double a, double b){
if(fabs(a) < eps) return b;
if(fabs(b) < eps) return a;
return gcd(b, fmod(a, b));
}
int main(){
double ax, ay, bx, by, cx, cy;
scanf("%lf%lf%lf%lf%lf%lf", &ax, &ay, &bx, &by, &cx, &cy);
double a = sqrt((bx-cx)*(bx-cx) + (by-cy)*(by-cy));
double b = sqrt((ax-cx)*(ax-cx) + (ay-cy)*(ay-cy));
double c = sqrt((ax-bx)*(ax-bx) + (ay-by)*(ay-by));
double p = (a+b+c)/2.0;
double S = sqrt(p*(p-a)*(p-b)*(p-c));
double R = a*b*c/(S*4);
double A = acos(1-a*a/(2*R*R));
double B = acos(1-b*b/(2*R*R));
double C = 2*pai-A-B;
double O = gcd(A, gcd(B, C));
printf("%.8lf\n", R*R*sin(O)*pai/O);
return 0;
}