题解:UVA11186 正多边形 Circum Triangle
题意简述
给你一个圆的半径
思路
注意到是在圆上,因此任选三个点一定能组成三角形。
因为
首先需要将极坐标转化为平面直角坐标,设极坐标下圆半径为
这个其实蛮好证明的:
根据三角函数的定义,可得
移项即可得到上面的式子。
现在的问题在于如何快速计算任意三角形面积。
我们可以采用下面的方法:
。
优点:只有乘法。
缺点:
。
缺点:
,其中 。
优点:三边使用两点距离公式
缺点:因为要多次根号,所以常数特大,在
- 向量叉积法
向量积可以被定义为:
模长:
方向:
观察法
但是我们如何快速求出叉积的模长呢?
下面是向量叉积的行列式定义(三维空间):
若
不难发现,因为这张图是二维空间,所以
三个向量
把它用行列式展开,得:
显然
所以
这样我们就能快速求了。
代码
#include<bits/stdc++.h>
using namespace std;
const double pi=acos(-1);
int n;
double r;
struct node{
double x,y;
}a[505];
node operator -(node a,node b) {
return (node){a.x-b.x,a.y-b.y};
}
const double eps=0.00000001;
//double X(double a,double b,double c,double d){
// return a*d-b*c;
//}
//double S(node x,node y,node z){
// return fabs(X(y.x-x.x,y.y-x.y,z.x-x.x,z.y-x.y));
//}
double Xx(node xx,node yy){
return xx.x*yy.y-xx.y*yy.x;
}
double Sx(node xx,node yy,node zz){
return fabs(Xx(yy-xx,zz-xx));
}
int main(){
while(1){
cin>>n>>r;
if(n==0&&abs(r)<=eps)break;
for(int i=1;i<=n;i++){
double q;
cin>>q;
q=q*1.0/180*pi;
a[i].x=cos(q)*r;
a[i].y=sin(q)*r;
}
double ans=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
for(int k=j+1;k<=n;k++){
ans+=Sx(a[i],a[j],a[k]);
}
}
}
printf("%.0lf\n",ans/2);
}
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】