和吴昊一起玩推理 Round 8 —— 计算几何一系列(A)—— 将椭圆切两刀(HDOJ 1724)
(Source:HDU1724)如图所示,以上,将这个椭圆切成三个部分,左一刀为L,右一刀为R,我们需要计算的是切开的一部分的面积。那么,对于这一块,利用三角换元当然是首选,因为,毕竟与图形有关系,步骤如下:
(1)y = b√1-x^2/a^2,这里是每一个x对应的一个y
(2)S =∫[l 到 r]{[b√(1-x^2/a^2)]}dx,其实,到了(2)这里还是有些复杂,需要改良一下
(3) 用三角换元:y=b*sinθ,x=a*cosθ
(4)x=l 对应θ1,x=r 对应θ2,则变换为:
(5)S =∫[θ1 到 θ2]{[bsinθ]}d(a*cosθ) = ∫[θ1 到
θ2]{-ab(sinθ)^2}dθ
(6)利用cos2θ =
1-2*(sinθ)^2就很容易积分出来
Input中的四个数分别是椭圆中参数a,b的值,以及L和R两刀的横坐标:
1 【C语言实现】
2
3 #include<stdio.h>
4 #include<math.h>
5 #include<stdlib.h>
6 int main()
7 {
8 int a,b,i,j,n,s,t;
9 double re,ans,ant;
10 scanf("%d",&n);
11 while(n--)
12 {
13 scanf("%d%d%d%d",&a,&b,&s,&t);
14 ant=acos(t/(float)a);
15 ans=acos(s/(float)a);
16 re=a*b*((sin(2*ant)-sin(2*ans))/2-(ant-ans));
17 printf("%.3f\n",re);
18 }
19 return 0;
20 }
21
22
23
24 【C++实现】
25
26 #include <iostream>
27 #include <iomanip>
28 #include <cmath>
29 using namespace std;
30
31 i nt main()
32 {
33 int N,A,B,L,R;
34 double angleL,angleR,S;
35 cin>>N;
36 while(N--)
37 {
38 cin>>A>>B>>L>>R;
39 angleL = acos(L/static_cast<double>(A));//acos -> [0,PI]
40 angleR = acos(R/static_cast<double>(A));
41 S = A*B*(angleL-angleR+(sin(2*angleR)-sin(2*angleL))/2);
42 cout<<fixed<<setprecision(3)<<S<<endl;
43 }
44 return 0;
45 }
46
47
2
3 #include<stdio.h>
4 #include<math.h>
5 #include<stdlib.h>
6 int main()
7 {
8 int a,b,i,j,n,s,t;
9 double re,ans,ant;
10 scanf("%d",&n);
11 while(n--)
12 {
13 scanf("%d%d%d%d",&a,&b,&s,&t);
14 ant=acos(t/(float)a);
15 ans=acos(s/(float)a);
16 re=a*b*((sin(2*ant)-sin(2*ans))/2-(ant-ans));
17 printf("%.3f\n",re);
18 }
19 return 0;
20 }
21
22
23
24 【C++实现】
25
26 #include <iostream>
27 #include <iomanip>
28 #include <cmath>
29 using namespace std;
30
31 i nt main()
32 {
33 int N,A,B,L,R;
34 double angleL,angleR,S;
35 cin>>N;
36 while(N--)
37 {
38 cin>>A>>B>>L>>R;
39 angleL = acos(L/static_cast<double>(A));//acos -> [0,PI]
40 angleR = acos(R/static_cast<double>(A));
41 S = A*B*(angleL-angleR+(sin(2*angleR)-sin(2*angleL))/2);
42 cout<<fixed<<setprecision(3)<<S<<endl;
43 }
44 return 0;
45 }
46
47