在给定3D三角形区域的情况下,从Voronoi单元求和平方面积变化?

时间:2015-02-20 16:23:34

标签: matlab triangulation voronoi geometry-surface finite-element-analysis

我有3D的三角形列表,形成一个表面(即三角测量)。该结构是变形的三角形格子。我想知道晶格的voronoi tessalation相对于未变形晶格单元的剩余区域(即相对于正六边形)的变形六边形的面积变化。事实上,我真的想要与这些三角形相关联的六边形单元格区域的平方变化的总和。

Area of deformed hexagon

背景/数学细节: 我用三角形格子逼近弯曲的弹性片。调整片材的泊松比(弹性常数)的一种方法是添加体积'应变能量项的能量。我试图计算一个体积大小的'变形的,弹性的,三角形晶格的应变能,定义为:U_volumetric = 1/2 T(e_v)^ 2,其中e_v = deltaV / V由voronoi单元相对于其参考区域的面积变化确定,这是一个已知的常数。

参考:https://www.researchgate.net/publication/265853755_Finite_element_implementation_of_a_non-local_particle_method_for_elasticity_and_fracture_analysis

想要:

Sum[ (DeltaA/ A).^2 ]覆盖所有六边形细胞。

我的数据存储在变量中:

xyz = [ x1,y1,z1; x2,y2,z2; etc] % 3D中的顶点/粒子

TRI = [ vertex0, vertex1, vertex2; etc] % 其中vertex0是位于第一个三角形的xyz的粒子的vertex 0行。

NeighborList = [ p1n1, p1n2, p1n3, p1n4, p1n5,p1n6 ; p2n1...] %其中p1n1是粒子1的第一个最近邻居,作为xyz的行索引。例如,xyz(NL(1,1),:)会返回粒子1的第一个邻居的xyz位置。

AreaTRI = [ areaTRI1; areaTRI2; etc]

我在MATLAB中写这篇文章。

截至目前,我将每个顶点的面积量近似为三角形区域的1/3,然后对6个最近邻居三角形求和。但是voronoi单元区域将不会完全等于Sum_(i = 0,1,... 5)1/3 * areaTRI_i,因此这是一个不好的近似值。请参阅上面链接中的图片,我认为这更清楚。

1 个答案:

答案 0 :(得分:0)

您可以使用文件交换中的DUALMESH - 提交来执行此操作:

  

DUALMESH是网格处理例程的工具箱,允许基于底层单纯三角剖分构造“双”网格。为各种平面和表面三角测量类型提供支持,包括非Delaunay和非流形类型。

只需使用以下命令生成所有双元素区域的向量areas。排序将对应于节点xyz

[cp,ce,pv,ev] = makedual2(xyz, TRI);
[~,areas(cp(:,1))] = geomdual2(cp,ce,pv,ev);

您可能希望使用以下方法查看边界区域:

trisurf(TRI, xyz(:,1), xyz(:,2), areas);

边界节点的双单元理论上是无界的,因此应该具有无限区域。此提交以不同方式处理它:它将返回无界单元格与原始网格的交集,而不是无界单元格。

另外请注意,如果您使用的网格不是平面的,则您的问题没有明确定义,因为双网格单元格将是平面的,并且不会以与三角形相同的方式缩放。因此,如果你的网格真的是2D,这个解决方案可能只能正常工作。 (据我所知,你提到的论文也仅适用于2D案例。)