任意给出一个三角形ΔABC,设其顶点坐标分别为A(x1, y1),B(x2, y2),C(x3, y3),那么根据线性代数的知识,ΔABC的有向面积可表示为:
其中,ΔABC顶点A、B、C逆时针给出时有向面积为正,顺时针给出时有向面积为负。如图1所示,S∆ABC>0、S∆ABD<0.
图1
我们知道任意的多边形都可以分割成多个三角形,根据以上三角形面积公式就可以求出任意多边形的面积。如图2所示的六边形顶点坐标分别为O(x0, y0),A(x1, y1),B(x2, y2),C(x3, y3),D(x4, y4),E(x5, y5),则其面积可以表示为四个三角形面积之和:S=S∆OAB+S∆OBC+S∆OCD+S∆ODE
其中:
所以
即
图2
在这里,前文给出的多边形示例是一个凸多边形,那么这一结论适用于凹多边形吗?下面我们看看如图3所示的凹多边形。
图3
按照上面的思路,这里的凹多边形面积表示为:S=S∆OAB+S∆OBC+S∆OCD,从前面介绍可以知道
S∆OAB=-S∆OBA<0,所以很明显上式是成立的,即此公式也适用于凹多边形。
经过以上分析,给出任意一个多边形,其顶点坐标依次为(x0,y0),(x1,y1),(x2,y2),...,(xn,yn)(其中n=2,3,4,…),则其面积可表示为:
换句话说,若已知多边形边上的每一点坐标,我们就可以求出该多边形的面积,包括如图4所示的曲线图形,当从O点到A点到O点的曲线上每一点坐标都已知时就能求出该曲线图的面积。
图4
struct Point2d
{double x;double y;Point2d(double xx, double yy): x(xx), y(yy){}
};//计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列
double ComputePolygonArea(const vector<Point2d> &points)
{int point_num = points.size();if(point_num < 3)return 0.0;double s = 0;for(int i = 0; i < point_num; ++i)s += points[i].x * points[(i+1)%point_num].y - points[i].y * points[(i+1)%point_num].x;return fabs(s/2.0);
}
或者:
struct Point2d
{double x;double y;Point2d(double xx, double yy): x(xx), y(yy){}
};//计算任意多边形的面积,顶点按照顺时针或者逆时针方向排列
double ComputePolygonArea(const vector<Point2d> &points)
{int point_num = points.size();if(point_num < 3)return 0.0;double s = points[0].y * (points[point_num-1].x - points[1].x);for(int i = 1; i < point_num; ++i)s += points[i].y * (points[i-1].x - points[(i+1)%point_num].x);return fabs(s/2.0);
}
或者:
<script>function square(x,y) {
//数组x,y分别按顺序存储各点的横、纵坐标值var sum0=0;for (var i = 0; i < x.length - 1; i++) {sum0 += (x[i] * y[i + 1] - x[i + 1] * y[i]);}var square = (Math.abs(sum0 + (x[i] * y[0]) - (x[0] * y[i]))) / 2;return square;}
</script>