从表面上的点构建表面网格的软件

计算科学 数字
2021-12-18 20:27:49

我有一组点(xi,yi,u(xi,yi))R3,i=1,N, 在表面上S(来自实验数据)。我需要计算一个函数的积分F在那个表面上。

如果这些点是体积上的点,我可以使用一些网格软件(例如,tetgen)并构建一个网格,然后计算所有内容。我的问题是它只是一个表面,所以如果我尝试使用一些网格软件,我将计算一个体积......

如何从给定点开始构建 2D(面)网格,然后遍历每个面以计算积分?

目前,我只需要一些关于如何计算“2D 网格”的建议。如果存在生成网格的软件,那将是完美的。

2个回答

它是否应该是一个封闭的表面?如果是,来自 VTK 库的泊松曲面重建是构建此类曲面的最佳选择和最简单的方法,请在此处查看此示例:https ://lorensen.github.io/VTKExamples/site/Cxx/Points/PoissonExtractSurface/

但是,如果它不是一个封闭的表面,你的问题就更难解决,你需要来自 CGAL 库的这种先进的前表面重建算法:https ://doc.cgal.org/latest/Advancing_front_surface_reconstruction/index.html

这是一种使用 Delaunay 三角剖分的方法。它是在deldir包的帮助下在 R 中执行的。

f <- function(x, y){
  exp(-(x^2+y^2)) # integrate to pi
}

x <- seq(-5, 5, length.out = 100)
y <- seq(-5, 5, length.out = 100)
grd <- transform(expand.grid(x=x, y=y), z = f(x,y)) # data (x_i, y_i, z_i)

library(deldir)
dd <- deldir(grd[["x"]], grd[["y"]], z = grd[["z"]]) # Delaunay
trgls <- triang.list(dd) # extracts all triangles

vol <- function(trgl){ # calculates volume under a triangle
  with(
    trgl, 
    sum(z)*(x[1]*y[2]-x[2]*y[1]+x[2]*y[3]-x[3]*y[2]+x[3]*y[1]-x[1]*y[3])/6
  )
}

volumes <- vapply(trgls, vol, numeric(1L))
sum(volumes)
# result: 3.141593, approx pi!

您可以绘制三角曲面:

x <- seq(-3, 3, length.out = 20)
y <- seq(-3, 3, length.out = 20)
grd <- transform(expand.grid(x=x, y=y), z = f(x,y))
dd <- deldir(grd[["x"]], grd[["y"]], z = grd[["z"]]) 

library(rgl)
persp3d(dd, front = "lines", back = "lines", col = "blue")
aspect3d(2, 2, 1)

在此处输入图像描述