地址: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 ", calc()) ; return 0 ; }