繁体   English   中英

如何在Rgl plot3d中绘制表面

[英]How to plot a surface in 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维而不是点,我找不到如何做到这一点。

谢谢你的帮助

您可以通过对表面进行三角测量来实现。 您没有提供实际数据,但我可以使用

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)

经过一些旋转后,得出以下图:

在此处输入图片说明

我不确定您想要什么。 如果我的理解是正确的,这是一个解决方案。 定义表面的参数表示:

fx <- function(u,v) u
fy <- function(u,v) v
fz <- function(u,v){
  ((u^2)+(3*v^2))*exp(-(u^2)-(v^2))
}

假设您有以下几点:

x0 <- seq(-3, 3, length.out = 20)
y0 <- seq(-3, 3, length.out = 20)

然后,您可以使用misc3d软件包的函数parametric3d ,并使用fill=FALSE选项来获取线框:

library(misc3d)
parametric3d(fx, fy, fz, u=x0, v=y0, 
             color="blue", fill = FALSE)

在此处输入图片说明

是你想要的吗?

为了得到一些竖线,使用功能segments3drgl

i <- 8
bar <- rbind(c(x0[i],y0[i],0),c(x0[i],y0[i],f(x0[i],y0[i])))
segments3d(bar, color="red")

这是使用我的原始代码仅绘制50个点的图。

50点散布图

然后,当我应用StéphaneLaurent所说的内容时,我得到的图在给出我的实际分数时感觉太准确了

线图

也许您需要向我解释parametric3d函数中实际发生的情况

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM