给定 3D 三角形面积,Voronoi 单元的平方面积变化求和?
Summing squared area changes from Voronoi cells given area of triangles in 3D?
我有一个构成表面的 3D 三角形列表(即三角剖分)。该结构是一个变形的三角格子。我想知道晶格的 voronoi tessalation 的变形六边形相对于未变形晶格单元的其余区域(即相对于正六边形)的面积变化。事实上,我真的想要与这些三角形相关联的六边形晶胞面积的平方变化之和。
Background/Math 详情:
我正在用三角格子近似弯曲弹性 sheet。调整 sheet 的泊松比(弹性常数)的一种方法是在能量中添加 'volumetric' 应变能项。我正在尝试计算变形的弹性三角晶格的 'volumetric' 应变能,定义为:U_volumetric = 1/2 T (e_v)^2,其中 e_v=deltaV/V 由 voronoi 单元的面积相对于其参考面积的变化确定,这是一个已知常数。
想要:
Sum[ (DeltaA/ A).^2 ]
所有六边形单元格。
我的数据存储在变量中:
xyz = [ x1,y1,z1; x2,y2,z2; etc] %
3Dvertices/particles
TRI = [ vertex0, vertex1, vertex2; etc] %
其中 vertex0
是位于第一个三角形 vertex 0
处的粒子的 xyz
行。
NeighborList = [ p1n1, p1n2, p1n3, p1n4, p1n5,p1n6 ; p2n1...]
% 其中 p1n1 是粒子 1 的第一个最近的邻居作为 xyz 的行索引。例如,xyz(NL(1,1),:)
returns 粒子 1 的第一个邻居的 xyz
位置。
AreaTRI = [ areaTRI1; areaTRI2; etc]
我正在用 MATLAB 写这个。
截至目前,我将每个顶点的面积近似为三角形面积的 1/3,然后对 6 个最近的相邻三角形求和。但是 voronoi 单元面积不会完全等于 Sum_(i=0,1,...5) 1/3* areaTRI_i,因此这是一个错误的近似值。请参阅上面 link 中的图像,我认为这更清楚。
您可以使用 DUALMESH 在文件交换中提交:
DUALMESH is a toolbox of mesh processing routines that allow the construction of "dual" meshes based on underlying simplicial triangulations. Support is provided for various planar and surface triangulation types, including non-Delaunay and non-manifold types.
只需使用以下命令生成所有对偶元素区域的向量areas
。排序将对应于节点 xyz
.
[cp,ce,pv,ev] = makedual2(xyz, TRI);
[~,areas(cp(:,1))] = geomdual2(cp,ce,pv,ev);
您可能想使用以下方法查看边界区域:
trisurf(TRI, xyz(:,1), xyz(:,2), areas);
边界节点的对偶单元理论上是无界的,因此应该有无限大的面积。但是,此提交的处理方式不同:它将 return 无界单元与原始网格的交集,而不是无界单元。
另请注意,如果您使用的网格不是平面的,则您的问题定义不明确,因为双网格单元将是平面的,并且不会像三角形一样缩放。因此,如果您的网格确实是 2D,则此解决方案可能只能正常工作。 (据我所知,你提到的论文也仅适用于二维情况。)
我有一个构成表面的 3D 三角形列表(即三角剖分)。该结构是一个变形的三角格子。我想知道晶格的 voronoi tessalation 的变形六边形相对于未变形晶格单元的其余区域(即相对于正六边形)的面积变化。事实上,我真的想要与这些三角形相关联的六边形晶胞面积的平方变化之和。
Background/Math 详情: 我正在用三角格子近似弯曲弹性 sheet。调整 sheet 的泊松比(弹性常数)的一种方法是在能量中添加 'volumetric' 应变能项。我正在尝试计算变形的弹性三角晶格的 'volumetric' 应变能,定义为:U_volumetric = 1/2 T (e_v)^2,其中 e_v=deltaV/V 由 voronoi 单元的面积相对于其参考面积的变化确定,这是一个已知常数。
想要:
Sum[ (DeltaA/ A).^2 ]
所有六边形单元格。
我的数据存储在变量中:
xyz = [ x1,y1,z1; x2,y2,z2; etc] %
3Dvertices/particles
TRI = [ vertex0, vertex1, vertex2; etc] %
其中 vertex0
是位于第一个三角形 vertex 0
处的粒子的 xyz
行。
NeighborList = [ p1n1, p1n2, p1n3, p1n4, p1n5,p1n6 ; p2n1...]
% 其中 p1n1 是粒子 1 的第一个最近的邻居作为 xyz 的行索引。例如,xyz(NL(1,1),:)
returns 粒子 1 的第一个邻居的 xyz
位置。
AreaTRI = [ areaTRI1; areaTRI2; etc]
我正在用 MATLAB 写这个。
截至目前,我将每个顶点的面积近似为三角形面积的 1/3,然后对 6 个最近的相邻三角形求和。但是 voronoi 单元面积不会完全等于 Sum_(i=0,1,...5) 1/3* areaTRI_i,因此这是一个错误的近似值。请参阅上面 link 中的图像,我认为这更清楚。
您可以使用 DUALMESH 在文件交换中提交:
DUALMESH is a toolbox of mesh processing routines that allow the construction of "dual" meshes based on underlying simplicial triangulations. Support is provided for various planar and surface triangulation types, including non-Delaunay and non-manifold types.
只需使用以下命令生成所有对偶元素区域的向量areas
。排序将对应于节点 xyz
.
[cp,ce,pv,ev] = makedual2(xyz, TRI);
[~,areas(cp(:,1))] = geomdual2(cp,ce,pv,ev);
您可能想使用以下方法查看边界区域:
trisurf(TRI, xyz(:,1), xyz(:,2), areas);
边界节点的对偶单元理论上是无界的,因此应该有无限大的面积。但是,此提交的处理方式不同:它将 return 无界单元与原始网格的交集,而不是无界单元。
另请注意,如果您使用的网格不是平面的,则您的问题定义不明确,因为双网格单元将是平面的,并且不会像三角形一样缩放。因此,如果您的网格确实是 2D,则此解决方案可能只能正常工作。 (据我所知,你提到的论文也仅适用于二维情况。)