hdu 1798

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1798

题意:给两个圆的圆心和半径求相交部分的面积。

mark:

思路是把相交部分分成2边,每边求一个扇形减三角形的面积。注意相离和内含的情况判断。

这题wa了n次,都是因为精度问题。一个三角形已知三边,求某角。可以用余弦定理直接求,也可以先用海伦公式算出面积,再用正弦定理求(误!!!)。但是海伦公式算面积后再正弦定理会产生比较大的误差!!!

# include <stdio.h>
# include <math.h>


double xa, ya, ra, xb, yb, rb ;
double pi = acos(-1);
double sq(double x){return x*x;}
double dist(double x1, double y1, double x2, double y2){return sqrt(sq(x1-x2)+sq(y1-y2));}


double calc()
{
    double d, t, a1, a2, p1, p2, p, area ;
    int flag = 0 ;
    d = dist(xa,ya,xb,yb) ;
    if (d >= ra+rb) return 0 ; //相离 
    if (ra > rb) t=ra,ra=rb,rb=t ;
    if (d <= rb-ra) return pi*ra*ra ;//内含 
    
     a1 = acos((ra*ra+d*d-rb*rb)/2/ra/d);//<----误差 
    a2 = acos((rb*rb+d*d-ra*ra)/2/rb/d);
    
    p1 = ra*ra*a1 - ra*ra*sin(a1)*cos(a1) ;
    p2 = rb*rb*a2 - rb*rb*sin(a2)*cos(a2) ;
    
    return p1+p2 ;
}


int main ()
{
    while (~scanf ("%lf%lf%lf%lf%lf%lf", &xa, &ya, &ra, &xb, &yb, &rb))
        printf ("%.3lf\n", calc()) ;
    return 0 ;
}

 

posted @ 2013-06-21 16:45  Seraph2012  阅读(254)  评论(0编辑  收藏  举报