zoukankan      html  css  js  c++  java
  • 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 }
    第二种方法比较简单。
  • 相关阅读:
    你的灯亮着么阅读笔记2
    你的灯亮着么阅读笔记1
    梦断代码阅读笔记3
    梦断代码阅读笔记2
    梦断代码阅读笔记1
    百度搜索分析
    有多少1
    寻找“水王”问题
    站立会议
    买书的最低价格问题
  • 原文地址:https://www.cnblogs.com/lijihong/p/2246415.html
Copyright © 2011-2022 走看看