和吴昊一起玩推理 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 

 

 

你可能感兴趣的:(round)