本文主要是介绍二维多边形和三维多面体的重心公式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
二维多边形和三维多面体的重心公式
本文主要讨论的是如何快速求解二维多边形和三维多面体的重心。最终的结果分别在公式 ( 3 ) ( 6 ) (3)(6) (3)(6)。
首先给出任意维几何体重心的公式,
x c = 1 V ∫ V x d V (1) \boldsymbol{x}_c =\frac{1}{V}\int_V \boldsymbol{x} dV \tag{1} xc=V1∫VxdV(1)
其中, x \boldsymbol{x} x是几何体中点的坐标。
二维任意多边形
二维多边形重心的求解思路是将多边形分解为若干个三角形,以三角形的面积为权重,对子三角形重心求加权平均值获得多边形的重心。
三角形面积和重心公式
任意三角形 Δ i j k \Delta ijk Δijk的重心公式为,
x c i j k = x i + x j + x k 3 (2) \boldsymbol{x}_c^{ijk}=\frac{\boldsymbol{x}_i+\boldsymbol{x}_j+\boldsymbol{x}_k}{3} \tag{2} xcijk=3xi+xj+xk(2)
其中, x i , x j , x k \boldsymbol{x}_i,\boldsymbol{x}_j,\boldsymbol{x}_k xi,xj,xk是三角形三个顶点的坐标。
面积公式可以使用秦九韶公式,或者
S = 1 2 ∣ 1 x i y i 1 x j y j 1 x k y k ∣ S= \frac{1}{2} \begin{vmatrix} 1 & x_i & y_i \\ 1 & x_j & y_j \\ 1 & x_k & y_k \end{vmatrix} S=21 111xixjxkyiyjyk
二维任意多边形的面积和重心公式
对任意一个二维多边形假设其有 N N N个顶点,也就是 N N N条边,则固定一个顶点,向与其不相邻的顶点做连线,可以将多边形分解为 N − 2 N-2 N−2个三角形,
下图是一个例子,
将六边形分解为 Δ 123 , Δ 134 , Δ 145 , Δ 156 \Delta 123,\Delta 134,\Delta 145,\Delta 156 Δ123,Δ134,Δ145,Δ156四个三角形。
任意 N N N边形,分解为 N − 2 N-2 N−2个三角形之后,重心公式(1)为,
x c = 1 V ∫ V x d V = ∑ i N − 2 ∫ V i x d V ∑ i N − 2 V i = ∑ i N − 2 ∣ V i ∣ x c i ∑ i N − 2 ∣ V i ∣ (3) \boldsymbol{x}_c = \frac{1}{V}\int_V \boldsymbol{x} dV = \frac{\displaystyle \sum_{i}^{N-2} \int_{V_i} \boldsymbol{x} dV}{\displaystyle \sum_{i}^{N-2} V_i} =\frac{\displaystyle \sum_{i}^{N-2} |V_i| \boldsymbol{x}_c^i}{\displaystyle\sum_i^{N-2} |V_i|} \tag{3} xc=V1∫VxdV=i∑N−2Vii∑N−2∫VixdV=i∑N−2∣Vi∣i∑N−2∣Vi∣xci(3)
其中, x c i \boldsymbol{x}_c^i xci和 ∣ V i ∣ |V_i| ∣Vi∣分别是三角形 Δ 1 , i + 1 , i + 2 \Delta 1,i+1,i+2 Δ1,i+1,i+2的重心和面积。
三维任意多面体
三维重心公式的推到需要散度定理(高斯-格林公式),会对多面体的边界三维多边形分解为若干个三角形,并求他们的面积和重心。
三维多面体的体积公式
这里 x = ( x , y , z ) \boldsymbol{x}=(x,y,z) x=(x,y,z)是点的坐标。
三维多面体的体积公式为,
V = ∫ V 1 d V = 1 3 ∫ V ∇ ⋅ x d V = 1 3 ∫ ∂ V x ⋅ n d S V=\int_V 1 dV = \frac{1}{3}\int_V \nabla \cdot \boldsymbol{x} dV =\frac{1}{3} \int_{\partial V} \boldsymbol{x} \cdot \boldsymbol{n} dS V=∫V1dV=31∫V∇⋅xdV=31∫∂Vx⋅ndS
其中, ∇ ⋅ x = ∂ x ∂ x + ∂ y ∂ y + ∂ z ∂ z = 1 + 1 + 1 = 3 \nabla \cdot \boldsymbol{x} =\frac{\partial x}{\partial x}+ \frac{\partial y}{\partial y} +\frac{\partial z}{\partial z}=1+1+1=3 ∇⋅x=∂x∂x+∂y∂y+∂z∂z=1+1+1=3,最后一个等式使用了散度定理(高斯-格林公式), n \boldsymbol{n} n是单位外法向量。 ∂ V \partial V ∂V是包围多面体 V V V的若干个多边形组成的。这些多边形可以按照第一节中的方式,分解为若干个三角形(假设分解为 N N N个三角形),因此多面体的体积是
V = 1 3 ∑ i = 1 N x c i ⋅ n i ∣ S i ∣ (4) V=\frac{1}{3}\sum_{i=1}^N \boldsymbol{x}_c^i \cdot \boldsymbol{n}_i |S_i| \tag{4} V=31i=1∑Nxci⋅ni∣Si∣(4)
其中,三角形重心的求解请见公式(2), S i S_i Si是第 i i i个三角形的面积, n i \boldsymbol{n}_i ni 是第 i i i个三角形指向多面体外的单位法向量。
三维多面体的重心公式
引入关于 x x x的标量函数 A A A,并记 A c A_c Ac为
A c = 1 V ∫ V A d V A_c=\frac{1}{V}\int_V A dV Ac=V1∫VAdV
显然有
A = 1 3 3 A = 1 3 ( ∇ ⋅ x ) A = 1 3 [ ∇ ⋅ ( A x ) − x ⋅ ∇ A ] A =\frac{1}{3} 3A =\frac{1}{3} (\nabla \cdot \boldsymbol{x})A =\frac{1}{3} [\nabla \cdot (A \boldsymbol{x} )-\boldsymbol{x}\cdot \nabla A] A=313A=31(∇⋅x)A=31[∇⋅(Ax)−x⋅∇A]
因此,利用上面两个式子
A c V = ∫ V A d V = ∫ V 1 3 [ ∇ ⋅ ( A x ) − x ⋅ ∇ A ] d V = 1 3 ∫ V ∇ ⋅ ( A x ) d V − 1 3 ∫ V x ⋅ ∇ A d V (5) A_cV= \int_V A dV =\int_V \frac{1}{3} [\nabla \cdot (A \boldsymbol{x} )-\boldsymbol{x}\cdot \nabla A] dV = \frac{1}{3} \int_V \nabla \cdot (A \boldsymbol{x} ) dV - \frac{1}{3} \int_V \boldsymbol{x}\cdot \nabla A dV \tag{5} AcV=∫VAdV=∫V31[∇⋅(Ax)−x⋅∇A]dV=31∫V∇⋅(Ax)dV−31∫Vx⋅∇AdV(5)
根据 A A A的任意性,可以分别取 A A A为 x , y , z x,y,z x,y,z,这里 x , y , z x,y,z x,y,z是向量 x \boldsymbol{x} x的分量。
因此, x ⋅ ∇ A \boldsymbol{x}\cdot \nabla A x⋅∇A 分别等于 x , y , z x,y,z x,y,z因此 公式(5)可以分别写为
x c V = 1 3 ∫ V ∇ ⋅ ( x x ) d V − 1 3 ∫ V x d V = 1 3 ∫ V ∇ ⋅ ( x x ) d V − 1 3 x c V x_c V = \frac{1}{3} \int_V \nabla \cdot (x \boldsymbol{x} ) dV - \frac{1}{3} \int_V x dV = \frac{1}{3} \int_V \nabla \cdot (x \boldsymbol{x} ) dV - \frac{1}{3} x_c V xcV=31∫V∇⋅(xx)dV−31∫VxdV=31∫V∇⋅(xx)dV−31xcV
y c V = 1 3 ∫ V ∇ ⋅ ( y x ) d V − 1 3 ∫ V y d V = 1 3 ∫ V ∇ ⋅ ( y x ) d V − 1 3 y c V y_c V = \frac{1}{3} \int_V \nabla \cdot (y \boldsymbol{x} ) dV - \frac{1}{3} \int_V y dV = \frac{1}{3} \int_V \nabla \cdot (y \boldsymbol{x} ) dV - \frac{1}{3} y_c V ycV=31∫V∇⋅(yx)dV−31∫VydV=31∫V∇⋅(yx)dV−31ycV
z c V = 1 3 ∫ V ∇ ⋅ ( z x ) d V − 1 3 ∫ V z d V = 1 3 ∫ V ∇ ⋅ ( z x ) d V − 1 3 z c V z_c V = \frac{1}{3} \int_V \nabla \cdot (z \boldsymbol{x} ) dV - \frac{1}{3} \int_V z dV = \frac{1}{3} \int_V \nabla \cdot (z \boldsymbol{x} ) dV - \frac{1}{3} z_c V zcV=31∫V∇⋅(zx)dV−31∫VzdV=31∫V∇⋅(zx)dV−31zcV
可以看到第一项和最后一项可以合并同类项,可以得到,
4 x c V = ∫ V ∇ ⋅ ( x x ) d V = ∫ S x x ⋅ n d S 4 x_cV = \int_V \nabla \cdot (x \boldsymbol{x} ) dV =\int_S x \boldsymbol{x} \cdot \boldsymbol{n} dS 4xcV=∫V∇⋅(xx)dV=∫Sxx⋅ndS
4 y c V = ∫ V ∇ ⋅ ( y x ) d V = ∫ S y x ⋅ n d S 4 y_cV = \int_V \nabla \cdot (y \boldsymbol{x} ) dV = \int_S y \boldsymbol{x} \cdot \boldsymbol{n} dS 4ycV=∫V∇⋅(yx)dV=∫Syx⋅ndS
4 z c V = ∫ V ∇ ⋅ ( z x ) d V = ∫ S z x ⋅ n d S 4 z_cV = \int_V \nabla \cdot (z \boldsymbol{x} ) dV = \int_S z \boldsymbol{x} \cdot \boldsymbol{n} dS 4zcV=∫V∇⋅(zx)dV=∫Szx⋅ndS
上面式子中第二个等式是再应用一次散度定理(高斯-格林公式)。注意 x , y , z x,y,z x,y,z是向量 x \boldsymbol{x} x的分量,三个分量写成一个向量式为,
4 x c V = ∫ S x ( x ⋅ n ) d S = ∑ i = 1 N ∫ S i x ( x ⋅ n ) d S = ∑ i = 1 N ( x c i ⋅ n i ) ∫ S i x d S = ∑ i = 1 N ( x c i ⋅ n i ) ∣ S i ∣ x c i 4 \boldsymbol{x}_c V =\int_S \boldsymbol{x}(\boldsymbol{x} \cdot \boldsymbol{n}) dS=\sum_{i=1}^N \int_{S_i} \boldsymbol{x}(\boldsymbol{x} \cdot \boldsymbol{n}) dS = \sum_{i=1}^N (\boldsymbol{x}_c^i \cdot \boldsymbol{n}_i) \int_{S_i} \boldsymbol{x} dS = \sum_{i=1}^N (\boldsymbol{x}_c^i \cdot \boldsymbol{n}_i) |S_i| \boldsymbol{x}_c^i 4xcV=∫Sx(x⋅n)dS=i=1∑N∫Six(x⋅n)dS=i=1∑N(xci⋅ni)∫SixdS=i=1∑N(xci⋅ni)∣Si∣xci
这里 ( x ⋅ n ) (\boldsymbol{x} \cdot \boldsymbol{n}) (x⋅n)能够从积分式子中拿出来的原因是它在 S i S_i Si上是一个常数,因此结合公式 ( 4 ) (4) (4)我们就可以得到三维多面体重心坐标公式,
x c = ∑ i = 1 N ( x c i ⋅ n i ) ∣ S i ∣ x c i 4 V = 3 ∑ i = 1 N ( x c i ⋅ n i ) ∣ S i ∣ x c i 4 ∑ i = 1 N x c i ⋅ n i ∣ S i ∣ (6) \boldsymbol{x}_c =\frac{\displaystyle \sum_{i=1}^N (\boldsymbol{x}_c^i \cdot \boldsymbol{n}_i) |S_i| \boldsymbol{x}_c^i }{4V} = \frac{\displaystyle 3\sum_{i=1}^N (\boldsymbol{x}_c^i \cdot \boldsymbol{n}_i) |S_i| \boldsymbol{x}_c^i }{\displaystyle 4 \sum_{i=1}^N \boldsymbol{x}_c^i \cdot \boldsymbol{n}_i |S_i| } \tag{6} xc=4Vi=1∑N(xci⋅ni)∣Si∣xci=4i=1∑Nxci⋅ni∣Si∣3i=1∑N(xci⋅ni)∣Si∣xci(6)
其中, x c i \boldsymbol{x}_c^i xci是将多面体 V V V的边界 ∂ V \partial V ∂V分解为第 i i i个三角形的重心, ∣ S i ∣ |S_i| ∣Si∣是其面积, n i n_i ni是单位外法向量。
参考文献
Z.-J. Wang, Improved formulation for geometric properties of arbitrary polyhedra, AIAA J. 37 (10) (1999) 1326–1327.
这篇关于二维多边形和三维多面体的重心公式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!