HDU5120 Intersection 【求圆的面积交】

Intersection

Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)

Total Submission(s): 41    Accepted Submission(s): 22

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

Source

2014ACM/ICPC亚洲区北京站-重现赛(感谢北师和上交)

S = A大B大 - A大B小 - A小B大 + A小B小。(A表示A环,大表示大圆,B同)。然后直接套模板。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;

const double eps = 1e-8;
const double PI = acos(-1.0);

int sgn(double x)
{
    if(fabs(x) < eps) return 0;
    if(x < 0) return - 1;
    else return 1;
}
struct Point
{
    double x, y;
    Point(){}
    Point(double _x, double _y)
    {
        x = _x; y = _y;
    }
    Point operator -( const Point &b) const
    {
        return Point(x - b. x, y - b. y);
    }

    double operator ^ (const Point &b) const
    {
        return x*b. y - y*b. x;
    }

    double operator * (const Point &b) const
    {
        return x*b. x + y*b. y;
    }

    void transXY(double B)
    {
        double tx = x,ty = y;
        x = tx* cos(B) - ty*sin(B);
        y = tx* sin(B) + ty*cos(B);
    }
};

double dist( Point a, Point b)
{
    return sqrt((a-b)*(a- b));
}

double Ac(Point c1, double r1, Point c2, double r2)
{
    double d = dist(c1,c2);
    if(r1 + r2 < d + eps) return 0;
    if(d < fabs(r1 - r2) + eps)
    {
        double r = min(r1,r2);
        return PI*r*r;
    }
    double x = (d*d + r1*r1 - r2*r2)/(2*d);
    double t1 = acos(x / r1);
    double t2 = acos((d - x)/r2);
    return r1*r1*t1 + r2*r2*t2 - d*r1*sin(t1);
}

int main() {
    int T; Point c1, c2;
    double ans, r, R, x1, y1, x2, y2;
    scanf("%d", &T);
    for(int cas = 1; cas <= T; ++cas) {
        scanf("%lf%lf%lf%lf%lf%lf", &r, &R, &x1, &y1, &x2, &y2);
        c1.x = x1; c1.y = y1;
        c2.x = x2; c2.y = y2;
        ans = Ac(c1, R, c2, R) - Ac(c1, R, c2, r) - Ac(c1, r, c2, R)
                + Ac(c1, r, c2, r);
        printf("Case #%d: %.6lf\n", cas, ans);
    }
    return 0;
} 
时间: 2024-10-09 19:42:15

HDU5120 Intersection 【求圆的面积交】的相关文章

HDU5120 Intersection(求 圆交)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5120 题目大意: 给定两个圆环 求相交部分的面积 分析: 画一个图,然后看一看分析下就可以得到结论  ans=  两个大圆相交的部分 +两个小圆相交的部分 - 一大一小圆相交的部分 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using name

HDU 5120 Intersection(圆的面积交)

题目大意:给你两个圆环,让你求出来圆环的面积交,需要用到圆的面积交,然后容斥一下,就可以得到圆环的面积交.画一下图就会很清晰. Intersection Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Submission(s): 526    Accepted Submission(s): 226 Problem Description Matt is a b

POJ 2546 &amp; ZOJ 1597 Circular Area 两圆的面积交

Circular Area Time Limit: 2 Seconds      Memory Limit: 65536 KB Your task is to write a program, which, given two circles, calculates the area of their intersection with the accuracy of three digits after decimal point. Input In the single line of in

ZOJ 1675 矩形与圆的面积交

Little Mammoth Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge It is well known that mammoths used to live in caves. This is a story of a little mammoth who lived in a cave with his mummy and daddy. The mammoth was little and ver

POJ 3675 Telescope 简单多边形和圆的面积交

这道题得控制好精度,不然会贡献WA  QAQ 还是那个规则: int sgn(double x){ if(x > eps) return 1; else if(x < - eps) return -1; else return 0; } 思路:把简单多边形的每一个点和原点连线,就把这个多边形和圆的交变成了多个三角形与圆的交,根据有向面积的思路,加加减减就可以得到公共面积. 贴上代码了- #include <cstdio> #include <cstring> #incl

JAVA求圆的面积

import java.text.DecimalFormat;import java.util.Scanner; public class TheAreaOfCircle { public static void main(String[] args) { /*问题描述 给定圆的半径r,求圆的面积. 输入格式 输入包含一个整数r,表示圆的半径. 输出格式 输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积. 说明:在本题中,输入是一个整数,但是输出是一个实数. 对于实数输出的问题,请

c++入门第一天(求圆的面积)

看了一会书,发现C++和C虽然于发上相似,但是解决问题的方式还是不一样的,毕竟面向对象和面向过程是两种不同的思维方式.下面就通过一个求圆的面积的例子,比较C和C++的不同. 需求:输入圆的半径,求解圆的面积 使用C语言来解决:1.定义两个变量半径r.面积s;  2.输入半径;  3.打印结果. 以下是源代码: #include <stdio.h> int main01() { double r, s; //定义变量圆和半径 printf("请输入圆的半径:"); scanf

OJ刷题之《默认参数--求圆的面积》

题目描述 根据半径r求圆的面积,如果不指定小数位数,输出结果默认保留两位小数. 部分代码已给定如下,只需要提交缺失的代码. #include <iostream> #include <iomanip> using namespace std; const double PI=3.14159; /* 补充缺少代码 */ int main() { double r; int precision; cin>>r>>precision; showarea(r); s

使用函数 求圆的面积

<?php /** 使用函数 求圆的面积 **/ function circle($n){ define('PI',3.14); echo PI * $n * $n; } circle(3); ?> 原文地址:https://www.cnblogs.com/xm666/p/11163286.html