1. 程式人生 > >HDU-OJ The area

HDU-OJ The area

問題描述

伊格納修斯上週買了一塊土地,但他不知道這塊土地的面積,因為土地被拋物線和一條直線包圍著。下圖顯示了該區域。現在考慮到圖片中顯示的所有交叉點,你能告訴Ignatius這片土地的面積嗎?

注意:圖中的點P1是拋物線的頂點。
 

 

 

輸入

輸入包含幾個測試用例。輸入的第一行是單個整數T,它是測試用例的數量。T測試案例如下。
每個測試用例包含三個相交點,如圖所示,它們按P1,P2,P3的順序給出。每個點由兩個浮點數X和Y(0.0 <= X,Y <= 1000.0)描述。

 

產量

對於每個測試用例,您應該輸出土地面積,結果應四捨五入到小數點後兩位。

 

樣本輸入

2
5.000000 5.000000
0.000000 0.000000
10.000000 0.000000
10.000000 10.000000
1.000000 1.000000
14.000000 8.222222

 

樣本輸出

33.33
40.69

暗示

對於浮動可能不夠準確,請使用double而不是float。

 

#include<cstdio>
#include<cstdlib>

int main()
{
	int T;
	double X0, X1, X2, Y0, Y1, Y2, a, b, c, k, B, m, n;
	scanf_s("%d", &T);
	while(T--)
	{
		scanf_s("%lf%lf%lf%lf%lf%lf", &X0, &Y0, &X1, &Y1, &X2, &Y2);
		a = (Y0 - Y1) / ((X0 - X1)*(X0 - X2)) - (Y1 - Y2) / ((X1 - X2)*(X0 - X2));
		b = (Y0 - Y1) / (X0 - X1) - ((X0 + X1)*(Y0 - Y1)) / ((X0 - X1)*(X0 - X2)) + (X0 + X1)*(Y1 - Y2) / ((X1 - X2)*(X0 - X2));
		c  = Y0 - a * X0*X0 - b*X0;
		k = (Y1 - Y2) / (X1 - X2);
		B = Y1 - k * X1;
		m = 1 / 3.0*a*X1*X1*X1 + 0.5*b*X1*X1 + c * X1 - 0.5*k*X1*X1 - B * X1;
		n= 1 / 3.0*a*X2*X2*X2 + 0.5*b*X2*X2 + c * X2 - 0.5*k*X2*X2 - B * X2;
		printf("%.2lf\n", n - m);
	}
	system("pause");
		return 0;
}