紫书 习题 10-3 UVa 1643(计算几何 叉乘)

直观感觉对角线重合的时候面积最大

然后可以根据方程和割补算出阴影部分的面积

注意知道两点坐标,可以求出与原点形成的三角形的面积

用叉乘,叉乘的几何意义以这两个向量为边的平行四边形的面积

所以用叉乘除以2就可以

(x1, y1), (x2, y2),叉乘为x1y2-y1x2

#include<cstdio>
#include<cmath>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

int main()
{
	int n;
	while(~scanf("%d", &n) && n)
	{
		double xa, xb, ya, yb, k1, k2;
		scanf("%lf%lf%lf%lf", &xa, &ya, &xb, &yb);
		k1 = ya / xa, k2 = yb / xb;
		if(k1 > k2) swap(k1, k2);
		
		double L = 0, l, sum = 0;
		REP(i, 0, n)
		{
			scanf("%lf", &l);
			L += l;
			sum += l * l / 2;
		}
		
		double x1 = (k1 + 1) / (k2 - k1) * L;
		double x2 = (k2 + 1) / (k2 - k1) * L;
		double y1 = k1 * x1, y2 = k2 * x2;
		printf("%.3lf\n", (x1 * y2 - x2 * y1) / 2 - sum);
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34416123/article/details/81164733