一道数学二维几何问题,少用高中的方程思维,多用一些math库里的东西,像反三角函数这样,直接计算出角度值进而计算就可。
记得 保留小数位数
#include<bits/stdc++.h> using namespace std; signed main() { int t; cin>>t; int k=0; double s1,s2; while(t--) { k++; double xc,yc,r; double xb,yb,xu,yu; cin>>xc>>yc>>r; cin>>xb>>yb>>xu>>yu; cout<<"Case "<<k<<": "; //先为左顶点设上未知数 double x0=xb,y0=yu; //计算 double deta_y=sqrt(r*r-(x0-xc)*(x0-xc)); double deta_x=sqrt(r*r-(y0-yc)*(y0-yc)); //计算相交的两个点的横纵坐标 double y=yc-deta_y; double x=xc+deta_x; //应该是 {x0,y}和{x,y0} //写出一个三角形的面积 s1=(y0-y)*(x-x0)/2.0; double x3=x0-xc; double y3=y-yc; double x4=x-xc; double y4=y0-yc; //写出圆上弦和半径构成的三角形的面积 s2=(x3*y4-x4*y3)/2.0; // cout<<"s2:"<<s2<<endl; //用反三角函数计算出角度值 后面用扇形面积公式得出结果 double sta=acos((x3*x4+y3*y4)/(sqrt(x3*x3+y3*y3)*sqrt(x4*x4+y4*y4))); //打印的时候记得 小数点保留位数 printf("%.5llf\n",s1+1/2.0*sta*r*r-s2); } }