2063 照亮的面积

描述

barty家买了一盏灯,他想计算一下家里的墙壁和地面总共有多少面积被灯光照亮了。

这个问题太简单了,所以他懒得写程序,所以就把这个简单的任务交给了你。

barty的家是一个边长为1的正方体,他在天花板的中心安装了这个灯,灯罩是圆锥形的,barty说,圆锥很美丽,所以你可以认为这盏灯发出的光形成了一个传说中的轴截面顶角为s的光锥。当然,顶角有可能很大很大。barty在告诉你s的值之后就去找MM玩了。你得在他回来之前完成这个任务。

轴截面顶角是什么?barty说,通过轴的截面不是个三角形嘛,这个还不知道……

输入

输入的第一行是一个整数,为数据的组数t(t<=180)。

每组数据占一行,为1个正整数s(0<=s<180)为灯罩轴截面顶角的度数。

 

输出

对于每组输入数据,输出barty家墙壁和地面总共有多少面积被灯光照亮了。四舍五入到小数点后五位即可。

样例输入
2
0
1
样例输出
0.00000

0.00024




微积分题

#include<iostream>
#include<cmath>
#include<iomanip>

using namespace std;

const double PI = 3.1415926;

double getcon( double x1, double x2 )
{
 double a = 0.5;

 double sq1 = sqrt( x1 * x1 + a * a );
 
 double sq2 = sqrt( x2 * x2 + a * a );

 double r1 = x1 / 2.0 * sq1 + a * a / 2.0 * log( x1 + sq1 );
 
 double r2 = x2 / 2.0 * sq2 + a * a / 2.0 * log( x2 + sq2 );

 return r1 - r2;
}

int main()
{
 // cout << atan( 0.5 ) / PI * 180 << endl;
 // cout << atan( 0.707 ) / PI * 180 << endl;
 int t;
 cin >> t;

 for ( int e = 0; e < t; e++ )
 {
  double n;
  cin >> n;
 
   n = n / 360.0 * 3.1415926; // get the top / 2 angle/
  
   double s = 0.0;

  if ( n > atan( sqrt( 2.0 ) / 2 ) )
  {
   s += 1.0;
   
   s += 4.0 * ( 1.0 - 1.0 / tan( n ) * getcon( 0.5, -0.5 ) );

  }
  else if ( n < atan( 0.5 ) )
  {
   s += PI * tan( n ) * tan( n );
  }
  else 
  {
   s +=  PI * tan( n ) * tan( n );

   double a = sqrt( tan( n ) * tan( n ) - 0.25 );
   double s2 =  atan( 2.0 * a ) * tan( n ) * tan( n ) - 0.5 * a;
   
   s -= 4.0 * s2;

   double x1 = sqrt( tan( n ) * tan( n ) - 0.25 );
   double x2 = -x1;

   s += 4.0 * ( 2 * x1 - 1.0 / tan( n ) * getcon( x1, x2 ) );
  
  }

  cout << fixed << setprecision( 5 ) << s << endl;

 }

 return 0;
}


你可能感兴趣的:(360,任务)