平面面积算法及应用
平面面积、形心、函数分布积分等问题是C++工程开发中常见问题,下面以平面面积为例介绍此类问题的计算方法;
数学表达
对于平面问题,由格林公式:
where:∬D(∂x∂fy−∂y∂fx)dxdy=∮∂Dfxdx+fydyf=(fx,fy)T
若构造:
f(x,y)=(0,x)T
则:
∂x∂fy−∂y∂fx=1
可得平面图形面积:
A=∬Ddxdy=∮∂Dxdy
算法描述
若在平面图形边界上将点取得足够密,则可用多边形逼近原平面图形面积,即每段曲线积分使用直线段代替:
A=∮∂Dxdy≈i=0∑n−1(∫Lixdy)
而:
i=0∑n−1(∫Lixdy)=i=0∑n−1xiΔyi=i=0∑n−1xi+21Δyi=k=0∑n−121(xk+xk+1)(yk+1−yk)=k=0∑n−121(xkyk+1−xk+1yk+xk+1yk+1−xkyk)=k=0∑n−121(xkyk+1−xk+1yk)+k=0∑n−121(xk+1yk+1−xkyk)
由于封闭图形首尾相连,即:
xn=x0,yn=y0
故:
k=0∑n−121(xk+1yk+1−xkyk)=0
因此,平面面积算法为:
A≈i=0∑n−1(∫Lixdy)=k=0∑n−121(xkyk+1−xk+1yk)
几何意义
上述算法的几何意义是:
多边形的面积=i∑多边形每一小段的两端点与原点围成的三角形有向面积
其图示如下:
图中,每一个小三角形有向面积的计算方法为:
Ak=21(rk×rk+1)⋅nz=21(xkyk+1−xk+1yk)
核心代码
上述算法的核心代码段如下所示:
double Polygon::area(const std::vector<Point> & pnts)
{
if (!isPolygon(pnts) || !isAntiClockwise(pnts)) {
throw std::runtime_error("points must be Polygon and AntiClockwise !");
}
double A = 0.0;
for (size_t i = 0; i < pnts.size(); ++i) {
A += 0.5 * (pnts[i].x() * pnts[i + 1].y() - pnts[i + 1].x() * pnts[i].y());
}
return A;
}
拓展推广
- 此种方法可以求解平面区域分布函数 g(x,y) 的面积分问题,只要构函数 f(x,y),使之满足如下条件即可:
∂x∂fy−∂y∂fx=g(x,y)
- 与二维问题类似,对于三维问题,使用高斯公式即可将体分布函数 g(x,y,z) 的积分问题转化为闭曲面积分问题,由于本文内容所限,故不在此展开;
参考