1. 程式人生 > >hdu 5120 Intersection(兩圓相交面積)(模板)

hdu 5120 Intersection(兩圓相交面積)(模板)

Intersection

題目連結:

解題思路:

在紙上畫畫圖,不難發現,根據容斥定理:所要求的面積為兩外環的交集(ans1)-外環和內環的交集(ans2*2,對稱)+兩內環的

交集(多減去的部分,現在補上)。

AC程式碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const double eps = 1e-6;
const double pi = acos(-1.0);
struct Point{
    double x,y;
    Point(double x = 0,double y = 0):x(x),y(y){} // 建構函式,方便程式碼編寫
};

double dis(Point p1,Point p2){
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

double area(Point c1,double r1,Point c2,double r2){
    double d = dis(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,t = 1;
    scanf("%d",&T);
    while(T--){
        Point p1,p2;
        double r1,r2;
        scanf("%lf%lf%lf%lf%lf%lf",&r1,&r2,&p1.x,&p1.y,&p2.x,&p2.y);
        double ans1 = area(p1,r2,p2,r2);
        double ans2 = area(p1,r1,p2,r2);
        double ans3 = area(p1,r1,p2,r1);
        printf("Case #%d: %.6lf\n",t++,ans1-2*ans2+ans3);
    }
    return 0;
}