我有一组点,, 在表面上(来自实验数据)。我需要计算一个函数的积分在那个表面上。
如果这些点是体积上的点,我可以使用一些网格软件(例如,tetgen)并构建一个网格,然后计算所有内容。我的问题是它只是一个表面,所以如果我尝试使用一些网格软件,我将计算一个体积......
如何从给定点开始构建 2D(面)网格,然后遍历每个面以计算积分?
目前,我只需要一些关于如何计算“2D 网格”的建议。如果存在生成网格的软件,那将是完美的。
我有一组点,, 在表面上(来自实验数据)。我需要计算一个函数的积分在那个表面上。
如果这些点是体积上的点,我可以使用一些网格软件(例如,tetgen)并构建一个网格,然后计算所有内容。我的问题是它只是一个表面,所以如果我尝试使用一些网格软件,我将计算一个体积......
如何从给定点开始构建 2D(面)网格,然后遍历每个面以计算积分?
目前,我只需要一些关于如何计算“2D 网格”的建议。如果存在生成网格的软件,那将是完美的。
它是否应该是一个封闭的表面?如果是,来自 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)