HDOJ1724-椭圆

Problem Description

Math is important!! Many students failed in 2+2’s mathematical test, so let's AC this problem to mourn for our lost youth..
Look this sample picture:



A ellipses in the plane and center in point O. the L,R lines will be vertical through the X-axis. The problem is calculating the blue intersection area. But calculating the intersection area is dull, so I have turn to you, a talent of programmer. Your task is tell me the result of calculations.(defined PI=3.14159265 , The area of an ellipse A=PI*a*b )

Input
Input may contain multiple test cases. The first line is a positive integer N, denoting the number of test cases below. One case One line. The line will consist of a pair of integers a and b, denoting the ellipse equation , A pair of integers l and r, mean the L is (l, 0) and R is (r, 0). (-a <= l <= r <= a).
Output
For each case, output one line containing a float, the area of the intersection, accurate to three decimals after the decimal point.
Sample Input
2
2 1 -2 2
2 1 0 2
Sample Output
6.283
3.142
Author
威士忌
Source
Recommend
lcy
1.古典方法,也就是直接求,需要用到椭圆扇形面积公式:S = a*b*arccos(x/a)/2
#include <iostream>
#include <cmath>
using namespace std;

#define PI 3.14159265
int main()
{
int n, a, b, l, r;
double Sl, Sr, S;
scanf("%d", &n);
while((n--) > 0)
{
scanf("%d %d %d %d", &a, &b, &l, &r);
if(l == r) S = 0;
else{
if(r <= 0)
{
Sl = 0.5*a*b*(PI-acos(l*1.0/a))
-0.5*abs(l)*b*sqrt(a*a-l*l)/a;
Sr = 0.5*a*b*(PI-acos(r*1.0/a))
-0.5*abs(r)*b*sqrt(a*a-r*r)/a;
S = 2*(Sr-Sl);
}
else if(l >= 0)
{
Sl = 0.5*b*(a*acos(l*1.0/a)-l*sqrt(a*a-l*l)/a);
Sr = 0.5*b*(a*acos(r*1.0/a)-r*sqrt(a*a-r*r)/a);
S = 2*(Sl-Sr);
}
else
{
Sl = Sl = 0.5*a*b*(PI-acos(l*1.0/a))
-0.5*abs(l)*b*sqrt(a*a-l*l)/a;
Sr = 0.5*b*(a*acos(r*1.0/a)-r*sqrt(a*a-r*r)/a);
S = PI*a*b - 2*(Sl+Sr);
}
}
printf("%.3f\n", S);
}
return 0;
}
2.采用微积分计算
 1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4
5 int main()
6 {
7 double t1, t2, S;
8 int n, a, b, l, r;
9 scanf("%d", &n);
10 while(n--)
11 {
12 scanf("%d %d %d %d", &a, &b, &l,&r);
13 t1 = asin(l*1.0/a);
14 t2 = asin(r*1.0/a);
15 S = a*b*(t2-t1+(sin(2*t2)-sin(2*t1))/2);
16 printf("%.3f\n", S);
17 }
18 return 0;
19 }
第二种方法比较简单。
posted @ 2011-11-12 14:30  lijihong0723  阅读(171)  评论(0编辑  收藏  举报
页脚测试