1. 程式人生 > 其它 >第一次排位賽 I. Farm

第一次排位賽 I. Farm

第一次排位賽 I. Farm

一道數學二維幾何問題,少用高中的方程思維,多用一些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);
	}
}