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

 

 

posted on 2013-02-27 22:39  吴昊系列  阅读(263)  评论(0编辑  收藏  举报

导航