三维表面插值

时间:2016-04-04 21:59:28

标签: r interpolation rgl

我有一个三列数据框,其中包含纬度,经度和地下测量值。我试图弄清楚如何在我拥有的点(不规则空间)之间插入数据点,然后创建整个区域的平滑表面图。我试过使用' surface3d'功能在' rgl'包但我的结果看起来像一个巨大的尖峰。我已经能够使用' plot3d'来绘制数据。但我需要更进一步,用插值填充空格。任何想法或建议?我也愿意使用其他软件包,当时rgl似乎是最合适的。

编辑:这是我的数据摘录(含水层深度的测量):

    var fillArray = function(num, len, list) {
        list.push(num);
        if (list.length === len) {
            return list;
        } else {
            return fillArray(num, len, list);
        }
    }

    var num = 3;
    var len = 3;
    var list = [];

    console.log(fillArray(num, len, list));

2 个答案:

答案 0 :(得分:4)

只是添加关于插值的小但(可能)重要的注释。

使用非常好的软件包“akima”,您可以轻松插入数据:

library(akima)
library(rgl)
# library(deldir)

# Create some fake data
x <- rnorm(100)
y <- rnorm(100)
z <- x^2 + y^2

# # Triangulate it in x and y
# del <- deldir(x, y, z = z)
# triangs <- do.call(rbind, triang.list(del))
# 
# # Plot the resulting surface
# plot3d(x, y, z, type = "n")
# triangles3d(triangs[, c("x", "y", "z")], col = "gray")

n_interpolation <- 200

spline_interpolated <- interp(x, y, z,
                              xo=seq(min(x), max(x), length = n_interpolation),
                              yo=seq(min(y), max(y), length = n_interpolation),
                              linear = FALSE, extrap = TRUE)

x.si <- spline_interpolated$x
y.si <- spline_interpolated$y
z.si <- spline_interpolated$z

persp3d(x.si, y.si, z.si, col = "gray")

Spline - interpolated picture (200 steps)

使用此软件包,您可以轻松更改插值的步数等。您需要至少10个(越多越好)点才能使用此软件包进行合理的样条插值。无论点数多少,线性版都能很好地工作。

P.S。感谢用户2554330 - 不知道deldir,在某些情况下确实很有用。

答案 1 :(得分:1)

你可以使用deldir包来获得你的点的Delaunay三角剖分,然后将其转换为triangles3d绘图所需的数据形式。我不知道这对于一个非常大的数据集有多么有效,但它似乎在100分上有效:

library(deldir)
library(rgl)
# Create some fake data
x <- rnorm(100)
y <- rnorm(100)
z <- x^2 + y^2

# Triangulate it in x and y
del <- deldir(x, y, z = z)
triangs <- do.call(rbind, triang.list(del))

# Plot the resulting surface
plot3d(x, y, z, type = "n")
triangles3d(triangs[, c("x", "y", "z")], col = "gray")

enter image description here

编辑添加:

R-forge上的rgl版本现在具有使这一过程变得简单的功能。您现在可以使用

生成类似于上图的绘图
library(deldir)
library(rgl)
plot3d(deldir(x, y, z = z))

还有一个函数可以从mesh3d输出构建deldir()个对象。