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
扫描二维码关注公众号,回复: 4526757 查看本文章

样本输出

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43411988/article/details/84340224