三棱锥之刻(求三棱锥中心球与表面覆盖面积之和)
生活随笔
收集整理的這篇文章主要介紹了
三棱锥之刻(求三棱锥中心球与表面覆盖面积之和)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://ac.nowcoder.com/acm/contest/9981/E
思路:
根據r和a的關系一共分4類情況:
①染色面積為0
②染色面積為4個圓形
③染色面積為三棱錐的內表面減去12個小三角(不是三角形,而是一個三角形往內刨掉一個弓形)
④染色面積為三棱錐的內表面全體
對于第三點我是這么求的,我沒用出題人的方法。我是圓形-弓形面積。
弓形面積公式:?
?其中θ為圓心角, r為半徑, a為弦長, h為圓心與弦構成的三角形的高。
球心到地面的距離是sqrt(6)*a/12;
剩下的根據高中基礎的立體幾何就可以算出來。
中間用到了一個tan(β/2),求角度的話用c++自帶的反三角。
#include<iostream> #include<vector> #include<queue> #include<cstring> #include<cmath> #include<map> #include<set> #include<cstdio> #include<algorithm> #define debug(a) cout<<#a<<"="<<a<<endl; using namespace std; const int maxn=1e5; const double pi=3.1415926525; typedef long long LL; inline LL read(){LL x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f;} int main(void) {cin.tie(0);std::ios::sync_with_stdio(false);double a,r;cin>>a>>r;double dis=sqrt(6)*a/12;if(r<=dis){printf("%.7f\n",0.0);}else if(r*r<=a*a/8){///相切double r1=r*r-dis*dis;///底面圓半徑的平方printf("%.7f\n",4*pi*r1);}else if(r*r>=9*a*a/24){printf("%.7f\n",sqrt(3)*a*a);}else{double r1=r*r-dis*dis;///底面圓半徑的平方double h1=sqrt(3)*a/6;///p在底面上的點到正三角形的垂直距離double xian=sqrt(r1-h1*h1);///弦長的一半double s=4*( (pi*r1)-3*(atan(xian/h1)*r1-2*xian*h1/2 ) );printf("%.7f\n",s);} return 0; }?
總結
以上是生活随笔為你收集整理的三棱锥之刻(求三棱锥中心球与表面覆盖面积之和)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac 安装jq
- 下一篇: jq 截取指定字符前_jq 截取字符串