Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在rgl plot3d中打印曲面_R_Rgl - Fatal编程技术网

如何在rgl plot3d中打印曲面

如何在rgl plot3d中打印曲面,r,rgl,R,Rgl,所以我有这个代码,可以生成精确的曲面 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

所以我有这个代码,可以生成精确的曲面

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))
给出以下曲线图: 现在我有了一些代码,可以使用随机行走metropolis算法来重现上面的图像。我认为它的工作原理就像我对这些计算值做了另一个绘图,我得到了下一张500点的图像。这是密码

open3d()
plot3d(x0, y0, f(x0, y0), type = "p")
它给出了以下曲线图: 我知道这是很难看这个静态图像,但能够旋转采样工作

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


谢谢你的帮助

我不知道你想要什么。如果我的理解是正确的,这里有一个解决方案。定义曲面的参数化表示:

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

这是你想要的吗

要获得一些垂直条,请使用rgl的功能
segments3d

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

i这是一个用我的原始代码绘制的只有50个点的图

当我应用Stéphane Laurent所说的话时,我得到了这个图,当给出我的实际点时,感觉太准确了


也许您需要向我解释一下函数中实际发生了什么
Parameteric3D

您可以通过对曲面进行三角剖分来实现这一点。您没有提供实际数据,但我可以使用

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)
这可能需要一些修饰性的修复,例如

aspect3d(2, 2, 1)
经过一段时间的旋转后,我得到了以下曲线图:


嗯。。。最后,我认为
parametric3d
不合适,因为它从
x0
y0
创建了一个点网格。但是也许可以修改源代码以获得合适的东西。哇,不,我认为这很好,谢谢!我会尝试一些类似的东西,看看它看起来怎么样,但我会再试着再说一遍。我想要的是所有的点都通过一个网络连接起来,这看起来很有希望。我对软件包和语言也很陌生,所以我不确定软件包中的哪些功能可以满足我的要求,但我认为您的丰富知识对我有所帮助。@MRT我不确定。。。使用
parametric3d
可以给出
x0
y0
,这些点是网格
展开的点。网格(x0,y0)
。没有必要使
x0
y0
具有相同的长度。在你的例子中,你不想要网格。没错,我不想要网格,但我刚刚试着用我的1000点分辨率运行它,所有这些都融合在一起,形成一个平滑的蓝色表面。我想问的一个问题是,你对这个函数
parametric3d
了解得够多吗?告诉我如何像我在问题中的散点图那样把盒子放在周围?哦,等等,有个问题。当我只使用几个点时,曲面看起来应该更加锯齿状,但是我不能显示图像,所以我会在这之后发布一个新的答案。我已经解释过:-)例如,当你给出
x0=c(1,2)
y0=c(3,4)
,然后
Parameteric3D
使用点
c(1,3)
c(1,4)
,c(2,3)
,c(2,4)
(通过“交叉”
x0
y0
获得的网格,换言之,是笛卡尔积)。我认为这与我所寻找的最接近,并且与其他答案一样,数据中没有额外的点,所以这非常好,谢谢
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)
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)