hdu-5120 Intersection(計算幾何)

來源:互聯網
上載者:User

標籤:

題目連結:

Intersection

Time Limit: 4000/4000 MS (Java/Others)    

Memory Limit: 512000/512000 K (Java/Others)


Problem Description Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The following figures are some famous examples you may know.


A ring is a 2-D figure bounded by two circles sharing the common center. The radius for these circles are denoted by r and R (r < R). For more details, refer to the gray part in the illustration below.


Matt just designed a new logo consisting of two rings with the same size in the 2-D plane. For his interests, Matt would like to know the area of the intersection of these two rings. 

 

Input The first line contains only one integer T (T ≤ 105), which indicates the number of test cases. For each test case, the first line contains two integers r, R (0 ≤ r < R ≤ 10).

Each of the following two lines contains two integers xi, yi (0 ≤ xi, yi ≤ 20) indicating the coordinates of the center of each ring. 

 

Output For each test case, output a single line “Case #x: y”, where x is the case number (starting from 1) and y is the area of intersection rounded to 6 decimal places. 

 

Sample Input 22 30 00 02 30 05 0 

 

Sample Output Case #1: 15.707963Case #2: 2.250778 題意: 求兩個圓環相交的面積; 思路: ans=兩個大圓的面積交+兩個小圓的面積交-2*大圓與小圓的面積交; AC代碼: 
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int N=1e5+6;const LL mod=1e9+7;const double PI=acos(-1.0);double fun(double x,double y,double fx,double fy,double r,double R){double    dis=sqrt((x-fx)*(x-fx)+(y-fy)*(y-fy));    //cout<<dis<<endl;        if(dis>=r+R)return 0;        else if(dis<=R-r)        {            return PI*r*r;        }        else        {            double angle1,angle2,s1,s2,s3,s;            angle1=acos((r*r+dis*dis-R*R)/(2*r*dis));        angle2=acos((R*R+dis*dis-r*r)/(2*R*dis));        s1=angle1*r*r;s2=angle2*R*R;        s3=r*dis*sin(angle1);        s=s1+s2-s3;        return s;        }}int main(){    int t;    scanf("%d",&t);    double r,R,x,y,fx,fy;    int cnt=1;    while(t--)    {        scanf("%lf%lf",&r,&R);        scanf("%lf%lf%lf%lf",&x,&y,&fx,&fy);        double ans1,ans2,ans3,ans4;        ans1=fun(x,y,fx,fy,R,R);        ans2=fun(x,y,fx,fy,r,r);        ans3=fun(x,y,fx,fy,r,R);        ans4=fun(fx,fy,x,y,r,R);        printf("Case #%d: ",cnt++);        printf("%.6lf\n",ans1+ans2-ans3-ans4);    }}

 

hdu-5120 Intersection(計算幾何)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.