codeforces 1C. Ancient Berland Circus(三角形面积,多边形面积,圆心角)

题目链接 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值