Codeforces 1C(外接圆与正多边形)
要点
- 各点肯定都在外接圆上,边越多越接近圆面积,所以要最小面积应当取可能的最少边数。
- 给三角形求外接圆半径公式:。
- 三个角度对应的圆心角取gcd即是要求的正多边形的一个角度,然后求面积即可。注意三个圆心角的求法是三个内角乘2.
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef double db;
const db PI = acos(-1.0);
const db eps = 1e-2;
db x[3], y[3], len[3];
db sqr(db x) {
return x * x;
}
db S(db a, db b, db c) {
db p = (a + b + c) / 2;
db res = p * (p - a) * (p - b) * (p - c);
return sqrt(res);
}
db calc(db c, db a, db b) {
db res = (sqr(a) + sqr(b) - sqr(c)) / 2 / a / b;
return acos(res + 1e-8);
}
db gcd(db a, db b) {
if (fabs(b) < eps) return a;
return gcd(b, fmod(a, b));
}
int main() {
for (int i = 0; i < 3; i++)
scanf("%lf%lf", &x[i], &y[i]);
db mul = 1.0;
for (int i = 0; i < 3; i++) {
int j = (i + 1) % 3;
len[i] = sqrt(sqr(x[i] - x[j]) + sqr(y[i] - y[j]));
mul *= len[i];
}
db R = mul / 4 / S(len[0], len[1], len[2]);
db delta = -1, select;
for (int i = 0; i < 3; i++) {
db tmp = calc(len[i], len[(i + 1) % 3], len[(i + 2) % 3]);
tmp *= 2;
if (delta < 0) delta = tmp;
else delta = gcd(tmp, delta);
}
db ans = sqr(R) * sin(delta) * PI / delta;
return !printf("%.20lf\n", ans);
}
分类:
计算几何
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具