三角形推广到多边形的面积计算(几何计算)

        我们先来看在坐标系下三角形的面积计算
在这里插入图片描述
        A(x1, y1),B(x2, y2), C(x3, y3)这三点,向量AB我记为a,向量AC我记为b,S_ABC = 1/2 absin<a, b>,a = (x, y), b = (m, n),代入:
在这里插入图片描述
a = (x2-x1, y2-y1),b = (x3-x1, y3-y1)
则 x = x2-x1, y = y2-y1, m = x3-x1, n = y3-y1;
则 S_ABC = 1/2|x1y2+x2y3+x3y1-x1y3-x3y2-x2y1|
实际上更好的办法是用三阶行列式写出来(只怪本人还未学线性代数):
在这里插入图片描述
        在这里我并没有规定方向,所以需要加上绝对值。实际上,如果是逆时针方向则为正,顺势针方向则为负,我们在这里可以将它称为有向面积:
        代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int x1, y1, x2, y2, x3, y3;
	double S;
	cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
	S = 0.5 * fabs(x1 * y2 + x2 * y3 + x3 * y1 - x1 * y3 - x3 * y2 - x2 * y1);
	printf("%.2lf\n", S);
	return 0;
}

        那对于多边形呢?实际上我们看,一个多边形也可以进行拆分成若干三角形,三角形面积的累加就为多变形的面积,如图:
在这里插入图片描述
        在这里我们可以起一个起点,比如S点,那么多边形SABCDE可以化成SBA、SCB、SDC、SED四个三角形的面积之和,假设S(x0, y0),A(x1, y1)、B(x2, y2)、C(x3, y3)、D(x4, y4)、E(x5, y5),在这里我们取逆时针方向(因为为正),利用上面的三阶行列式及其展开:
在这里插入图片描述
        然后我们再来求加和,可以得到:
在这里插入图片描述
        发现什么特点了吗?是不是交错相乘相减再求累加和,但是在这里需要注意最后一项是首尾坐标,在这里是S(x0, y0)和E(x5, y5)点,被减去,我们可以得到一个公式:
        S = ∑ i = 0 n − 1 x i y ( i + 1 ) − x ( i + 1 ) y i \sum_{i=0}^{n-1} x_iy_(i+1)-x_(i+1)y_i i=0n1xiy(i+1)x(i+1)yi-(x0yn-1-xn-1y0)
        代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int i, n, a[100][2];
	double S;
	printf("请问有多少个顶点?\n");
	cin >> n;
	for (i = 0; i < n; i++)
	{
		cin >> a[i][0] >> a[i][1];
	}
	S = 0;
	for (i = 0; i < n - 1; i++)
	{
		//按照逆时针方向旋转
		S += 0.5 * (a[i][0] * a[i + 1][1] - a[i + 1][0] * a[i][1]);
	}
	S += 0.5 * (a[0][0] * a[n - 1][1] - a[n - 1][0] * a[0][1]);
	printf("面积为:\n");
	printf("%.2f\n", S);
	return 0;
}

在这里无论是凸多边形还是凹多边形,都可以采用这样的方式去求解,因为当你规定逆时针方向时,实际上的面积是为有向面积,此时,你在顺势针方向上读时的面积为负则恰好减去原来多的一块面积,所以也可也采用此方法。
听说也可以采用皮克定理来做,有兴趣的同学可以看一看,只做借鉴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值