zoukankan      html  css  js  c++  java
  • hdu 5120 Intersection (圆环面积相交->圆面积相交)

    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
    2
    2 3
    0 0
    0 0
    2 3
    0 0
    5 0
    Sample Output
    Case #1: 15.707963
    Case #2: 2.250778
     
    两个圆环相交,然而我只有圆相交的板子
    首先拿其中一个大圆A与另一个大圆B和小圆b算交面积,两者相减,求的是A与圆环Bb相交的面积 area1
    然后拿小圆a另一个大圆B和小圆b算交面积,两者相减,求的是a与圆环Bb相交的面积,area2
    我们输出area1-area2就行了
     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 const double PI = acos(-1.0);
     5 const double eps = 1e-8;
     6 int dblcmp (double k)
     7 {
     8     if (fabs(k)<eps) return 0;
     9     return k>0?1:-1;
    10 }
    11 struct Point
    12 {
    13     double x,y;
    14 };
    15 double dis (Point a,Point b)
    16 {
    17     return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    18 }
    19 double area_of_overlap (Point c1,double r1,Point c2,double r2)//圆相交模板
    20 {
    21     double d = dis(c1,c2);
    22     if (r1+r2<d+eps) return 0;
    23     if (d<fabs(r1-r2)+eps){
    24         double r = min(r1,r2);
    25         return PI*r*r;
    26     }
    27     double x = (d*d+r1*r1-r2*r2)/(2*d);
    28     double t1 = acos(x/r1);
    29     double t2 = acos((d-x)/r2);
    30     return r1*r1*t1+r2*r2*t2-d*r1*sin(t1);
    31 }
    32 int t;
    33 int casee = 0;
    34 int main()
    35 {
    36     //freopen("de.txt","r",stdin);
    37     scanf("%d",&t);
    38     while (t--){
    39         Point p1,p2;
    40         double r1,r2;
    41         scanf("%lf%lf",&r1,&r2);
    42         scanf("%lf%lf",&p1.x,&p1.y);
    43         scanf("%lf%lf",&p2.x,&p2.y);
    44         if (dblcmp(r1-r2)>0) swap(r1,r2);
    45         double ans = area_of_overlap (p1,r2,p2,r2) -area_of_overlap (p1,r2,p2,r1)
    46                     -(area_of_overlap (p1,r1,p2,r2) - area_of_overlap(p1,r1,p2,r1) );
    47         /*double ans = area (p1,r2,p2,r2) -area (p1,r2,p2,r1)
    48         -(area(p1,r1,p2,r2) - area(p1,r1,p2,r1) );*/
    49         printf("Case #%d: %.6f
    ",++casee,ans);
    50     }
    51     return 0;
    52 }
     
  • 相关阅读:
    Java 8特性
    11成最多体积的容器
    MySQL数据库理解
    java范型
    ArrayList源码分析
    1.面试题
    jvm简单了解
    121. 买卖股票的最佳时机
    有效的括号
    java如何判断一个字符串中某个字符有几个
  • 原文地址:https://www.cnblogs.com/agenthtb/p/7643492.html
Copyright © 2011-2022 走看看