二维多边形和三维多面体的重心公式

2023-10-17 06:50

本文主要是介绍二维多边形和三维多面体的重心公式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二维多边形和三维多面体的重心公式

本文主要讨论的是如何快速求解二维多边形和三维多面体的重心。最终的结果分别在公式 ( 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=V1VxdV(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 N2个三角形,

下图是一个例子,
在这里插入图片描述

将六边形分解为 Δ 123 , Δ 134 , Δ 145 , Δ 156 \Delta 123,\Delta 134,\Delta 145,\Delta 156 Δ123,Δ134,Δ145,Δ156四个三角形。

任意 N N N边形,分解为 N − 2 N-2 N2个三角形之后,重心公式(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=V1VxdV=iN2ViiN2VixdV=iN2ViiN2Vixci(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=31VxdV=31VxndS
其中, ∇ ⋅ 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=xx+yy+zz=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=1NxciniSi(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=V1VAdV
显然有
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)xA]
因此,利用上面两个式子
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)xA]dV=31V(Ax)dV31VxAdV(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 xA 分别等于 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=31V(xx)dV31VxdV=31V(xx)dV31xcV

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=31V(yx)dV31VydV=31V(yx)dV31ycV

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=31V(zx)dV31VzdV=31V(zx)dV31zcV

可以看到第一项和最后一项可以合并同类项,可以得到,
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=SxxndS

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=SyxndS

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=SzxndS

上面式子中第二个等式是再应用一次散度定理(高斯-格林公式)。注意 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(xn)dS=i=1NSix(xn)dS=i=1N(xcini)SixdS=i=1N(xcini)Sixci
这里 ( x ⋅ n ) (\boldsymbol{x} \cdot \boldsymbol{n}) (xn)能够从积分式子中拿出来的原因是它在 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=1N(xcini)Sixci=4i=1NxciniSi3i=1N(xcini)Sixci(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.

这篇关于二维多边形和三维多面体的重心公式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/223681

相关文章

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能