首页 > 代码库 > [HDU1724]Ellipse

[HDU1724]Ellipse

题目:Ellipse

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1724

题目简述:给定一个椭圆,求椭圆上一个区间[l,r]的面积。

分析:

 (1)椭圆方程式:$\frac{x^2}{a^2}+\frac{y^2}{b^2}=1$。

 (2)椭圆上[l,r]区间的面积由X轴上方与X轴下方2部分组成,由于两部分面积一样,我们只考虑X轴上方的那部分面积。

 (3)椭圆上y关于x的变化函数:$y=f(x)=\frac{b}{a}*\sqrt{a^2-x^2}$

 (4)椭圆上表达式:$S=2*\int_l^r{f(x)dx}=2*\int_l^r{\frac{b}{a}*\sqrt{a^2-x^2} dx}$

 (5)算法一:用自适应希普森积分法:

 (6)算法二:数学好的可以计算这个积分式,然后直接用。

代码:

#include <cstdio>
#include <cmath>
const double eps=1e-10;
double a,b;
double F(double x){
    return sqrt(a*a-x*x);
}
double Simpson(double l,double r){
    return (r-l)*(F(l)+4*F((l+r)/2)+F(r))/6;
}
double Integral(double l,double r,double S){
    double mid=(l+r)/2;
    double A=Simpson(l,mid);
    double B=Simpson(mid,r);
    if(A+B-S<eps)return S;
    return Integral(l,mid,A)+Integral(mid,r,B);
}
int main(){
    int Case;scanf("%d",&Case);
    for(double l,r,S;Case--;){
        scanf("%lf %lf %lf %lf",&a,&b,&l,&r);
        S=2*b/a*Integral(l,r,Simpson(l,r));
        printf("%.3f\n",S);
    }
    return 0;
} 

 

#include<cstdio>
#include<cmath> 
double a,b,l,r;
double F(double x){
    double t=asin(x/a);
    return 0.5*a*b*(t+0.5*sin(2*t));
}
int main(){
    int Case;scanf("%d",&Case);
    for(;Case--;){
        scanf("%lf%lf%lf%lf",&a,&b,&l,&r);  
        printf("%.3lf\n",2*(F(r)-F(l))); 
    }
    return 0;  
}  

 

[HDU1724]Ellipse