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

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

相关文章

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只怪。请问他能

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决

word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决 问题描述 最近在投一篇期刊论文,直接提交word文档,当时没有查看提交预览,一审审稿意见全是:公式乱码、公式乱码、乱码啊!!!是我大意了,第二次提交,我就决定将word文档转成PDF后再提交,避免再次出现公式乱码的问题。接着问题又来了,我利用‘文件/导出’或‘文件/另存为’的方式将word转成PDF后,发现公式