我正在嘗試創建一個 3D 形狀圖,就像在 MATLAB 中使用 patch 命令所做的那樣,如下所示:

我使用 expand.grid 創建了我的坐標資料:
library(pracma)
n1=60
n2=60
n3=60
data = expand.grid(x=linspace(-3,3,n1),y=linspace(-3,3,n2),z=linspace(-3,3,n3))
我使用這些資料填充 3D 矩陣以獲得 3D 矩陣 V,它定義了形狀:
someData <- rep(0, 60*60*60)
V <- array(someData, c(60, 60, 60))
count = 1
lambda = c(2,1,1)
for (ii in 1:n1){
for (jj in 1:n2){
for (kk in 1:n3){
V[ii, jj, kk] = t(as.matrix(lambda))%*%as.matrix(c(data$x[count],data$y[count],data$z[count]))
count = count 1
}
}
}
但是,我正在努力在 R 中繪制它。
可重現的 MATLAB 示例:
n1 = 60;
n2 = 60;
n3 = 60;
[y,x,z] = ndgrid(linspace(-3,3,n1),linspace(-3,3,n2),linspace(-3,3,n3));
V = zeros(n1, n2, n3);
lambda = [2;1;1];
for ii = 1: n1
for jj = 1:n2
for kk =1:n3
V(ii, jj, kk) = lambda'*[abs(y(ii, jj, kk)); abs(x(ii, jj, kk)); abs(z(ii, jj, kk))];
end
end
end
p = patch(isosurface(x,y,z,V,1));
p.FaceColor = 'cyan';
p.EdgeColor = 'none';
view(3);
camlight
axis equal
lighting gouraud
box on
我在 R 中的嘗試:
n1=60
n2=60
n3=60
someData <- rep(0, 60*60*60)
V <- array(someData, c(60, 60, 60))
data = expand.grid(x=linspace(-3,3,n1),y=linspace(-3,3,n2),z=linspace(-3,3,n3))
lambda = c(2,1,1)
count = 1
for (ii in 1:n1){
for (jj in 1:n2){
for (kk in 1:n3){
V[ii, jj, kk] = t(as.matrix(lambda))%*%as.matrix(c(data$x[count],data$y[count],data$z[count]))
count = count 1
}
}
}
M = melt(V)
plot_ly(type = "mesh3d",
x = data$x,
y = data$y,
z = data$z,
i = M$Var1,
j = M$Var2,
k = M$Var3,
facecolor = rep(toRGB(colorRampPalette(c("navy", "blue"))(6)), each = 2)
)
但是,我只是得到一個空坐標軸,沒有形狀
uj5u.com熱心網友回復:
您可以使用rmarchingcubes包來計算等值面,并使用rgl包來繪制 3D。我用下面的代碼得到的形狀看起來像一個菱形。我沒有嘗試改進您的代碼(有可能的改進)。
library(pracma)
library(rmarchingcubes) # to compute isosurface
library(rgl) # to plot in 3D
# your code with a couple of modifications
n1 <- 60
n2 <- 60
n3 <- 60
x <- linspace(-3, 3, n1)
y <- linspace(-3, 3, n2)
z <- linspace(-3, 3, n3)
data <- expand.grid(x = x, y = y, z = z)
someData <- rep(0, 60 * 60 * 60)
V <- array(someData, c(60, 60, 60))
count <- 1
lambda <- c(2, 1, 1)
for(ii in 1:n1) {
for(jj in 1:n2) {
for(kk in 1:n3) {
V[ii, jj, kk] <- t(as.matrix(lambda)) %*% # you forgot the absolute value:
abs(as.matrix(c(data$x[count], data$y[count], data$z[count])))
count <- count 1
}
}
}
# compute isosurface
isosurface <- contour3d(
griddata = V, level = 1, x = x, y = y, z = z
)
# make rgl mesh
mesh <- tmesh3d(
vertices = t(isosurface[["vertices"]]),
indices = t(isosurface[["triangles"]]),
normals = isosurface[["normals"]],
homogeneous = FALSE
)
# plot
shade3d(mesh, color = "turquoise")
編輯
計算的一大改進V:
Mat <- abs(t(as.matrix(data)))
V <- array(t(lambda) %*% Mat, dim = c(n1, n2, n3))
編輯
如果你真的想使用plotly:
library(plotly)
vs = isosurface[["vertices"]]
idx = isosurface[["triangles"]] - 1
plot_ly(
x = vs[,1], y = vs[,2], z = vs[,3],
i = idx[,1], j = idx[,2], k = idx[,3],
type = "mesh3d"
) %>% layout(scene = list(aspectmode = "data"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/524538.html
標籤:rmatlab3d
上一篇:將多列添加到R資料框時出錯
