zoj 1597 || poj 2546 Circular Area(数学题)

给你俩圆的圆心坐标,半径,求俩圆相交面积。

 

分,相交,相离,内含。

 

纯数学题。根据边长求cos值差点想不起来。。。本来想用积分做的,发现,积分忘光了 = =。。。

 

就用扇形面积减去三角形面积就好了,注意,不能乘2,因为被公共弦分开的两部分不一定是对称的。

 

π要取 3.141592654...以上。。。小数点后位数不够的话会WA死的 = =。。。

 

 

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <math.h> #define pi 3.141592654 //这个小数点后位数要多点,要不就WA了。 using namespace std; double h; double len(double x1,double y1,double x2,double y2)//勾股定理求长度 { return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); } double cosd(double a,double c) // 根据边长求cos { return (a*a + h*h -c*c )/(2*a*h); } double S(double r) //圆面积函数 { return pi*r*r; } double SAN(double ra,double rb,double h) { double cosaa = cosd(ra,rb); // cos值 double fcosaa = acos(cosaa)*2; //夹角 double hulen = fcosaa*ra; //弧长 double Shu = hulen * ra/2; // 扇形面积 double Ssan = ra*ra*sin(fcosaa)/2; // 三角形面积 return (Shu - Ssan); //扇形面积减去三角形面积 } int main(void) { double x1,y1,x2,y2,r1,r2,output; while( scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&r1,&x2,&y2,&r2) != EOF ) { h = len(x1,y1,x2,y2); //两圆心的连线长 if( h + r1 <= r2 ) { output = S(r1); printf("%.3f/n",S(r1)); continue; } if( h + r2 <= r1 ) { output = S(r2); printf("%.3f/n",S(r2)); continue; } if( r1 + r2 <= h ) { printf("0.000/n"); continue; } output = SAN(r1,r2,h)+SAN(r2,r1,h); printf("%.3f/n",output); } return 0; }

你可能感兴趣的:(c,output)