首页 > 解决方案 > 如何在 rgl plot3d 中绘制曲面

问题描述

所以我有这段代码可以产生精确的表面

f = function(x, y){
    z = ((x^2)+(3*y^2))*exp(-(x^2)-(y^2))
}
plot3d(f, col = colorRampPalette(c("blue", "white")), 
       xlab = "X", ylab = "Y", zlab = "Z", 
       xlim = c(-3, 3), ylim = c(-3, 3),
       aspect = c(1, 1, 0.5))

给出以下情节: 3d 精确绘图 现在我有一些代码可以执行随机游走大都会算法来重现上面的图像。我认为它的工作原理就像我对这些计算值进行另一张图一样,我得到了下一张 500 分的图像。这是代码

open3d()
plot3d(x0, y0, f(x0, y0), type = "p")

这给出了以下情节: 在此处输入图像描述 我知道很难看这个静止图像,但能够旋转采样是有效的。

现在这是我的问题:我该如何使用plot3d()才能拥有一个连接所有这些点的表面,并提供更锯齿状的精确图表示?或者如何将 z 轴上的每个点作为 xy 平面的条形?我只想要比点更 3 维的东西,但我找不到如何做到这一点。

谢谢你的帮助

标签: rrgl

解决方案


您可以通过对曲面进行三角测量来做到这一点。你没有给我们你的实际数据,但我可以使用创建一些类似的数据

f = function(x, y){
    z = ((x^2)+(3*y^2))*exp(-(x^2)-(y^2))
}
x <- runif(500, -3, 3)
y <- runif(500, -3, 3)
z <- f(x, y)

然后使用以下方法完成绘图?persp3d.deldir

library(deldir)
library(rgl)
col <- colorRampPalette(c("blue", "white"))(20)[1 + round(19*(z - min(z))/diff(range(z)))]
dxyz <- deldir::deldir(x, y, z = z, suppressMsge = TRUE)
persp3d(dxyz, col = col, front = "lines", back = "lines")

这可能需要一些外观修复,例如

aspect3d(2, 2, 1)

经过一些旋转,这给了我以下情节:

在此处输入图像描述


推荐阅读