码迷,mamicode.com
首页 > 其他好文 > 详细

poj 2546(两圆公共面积)

时间:2016-05-03 22:14:18      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:

Circular Area
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5682   Accepted: 2225

Description

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 input file there are space-separated real numbers x1 y1 r1 x2 y2 r2. They represent center coordinates and radii of two circles.

Output

The output file must contain single real number - the area.

Sample Input

20.0 30.0 15.0 40.0 30.0 30.0

Sample Output

608.366
///题意:两个圆之间的相交面积
#include<stdio.h>
#include<iostream>
#include<string.h>
#include <stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int N = 2;
const double pi = atan(1.0)*4;
struct Circle{
    double x,y,r;
}c[N];
typedef Circle Point;
double dis(Point a, Point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
///两圆相交面积模板
double Two_Circle_Area(Circle a,Circle b){
    double d = dis(a,b);
    if(a.r+b.r<d){ ///相离
        return 0;
    }
    if(fabs(a.r-b.r)>=d){ ///内含
        int r = min(a.r,b.r);
        return pi*r*r;
    }
    double angleA = acos((a.r*a.r+d*d-b.r*b.r)/2/a.r/d);
    double angleB = acos((b.r*b.r+d*d-a.r*a.r)/2/b.r/d);
    double area1 = a.r*a.r*angleA; ///扇形面积公式 S = r*r*圆心角 / 2;
    double area2 = b.r*b.r*angleB;
    return area1+area2-a.r*d*sin(angleA);
}
int main(){
    while(scanf("%lf%lf%lf%lf%lf%lf",&c[0].x,&c[0].y,&c[0].r,&c[1].x,&c[1].y,&c[1].r)!=EOF){
        printf("%.3lf\n",Two_Circle_Area(c[0],c[1]));
    }
    return 0;
}

 

poj 2546(两圆公共面积)

标签:

原文地址:http://www.cnblogs.com/liyinggang/p/5456612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!