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 }
第二种方法比较简单。

转载于:https://www.cnblogs.com/lijihong/archive/2011/11/12/2246415.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值