Как преобразовать эллипсоид в mesh3d в R?
Я использую метод ellipsoidhull из кластерного пакета, чтобы получить минимальный объем, включающий эллипсоид (mvee) из набора точек. Этот метод возвращает объект класса эллипсоид. Мне нужно построить сгенерированный эллипсоид. Я пытался использовать метод wire3d из пакета rgl для построения эллипсоидов, но этот метод получает объекты класса mesh3d в качестве входного параметра. Как я могу преобразовать объект эллипсоида в объект mesh3d?
2 ответа
Если вы на самом деле не заботитесь о сетке и просто хотите построить прозрачный эллипсоид, вы можете использовать это:
library(rgl)
library(cluster)
open3d()
ellipsoid3d <- function(cen, a = 1,b = 1,c = 1,n = 65, ...){
f <- function(s,t){
cbind( a * cos(t)*cos(s) + cen[1],
b * sin(s) + cen[2],
c * sin(t)*cos(s) + cen[3])
}
persp3d(f, slim = c(-pi/2,pi/2), tlim = c(0, 2*pi), n = n, add = T, ...)
}
set.seed(123)
n <- 6
for (i in 1:n){
cen <- 3*runif(3)
a <- runif(1)
b <- runif(1)
c <- runif(1)
clr <- c("red","blue","green")[i %% 3 + 1 ]
elpf <- ellipsoid3d(cen,a=a,b=b,c=c,col=clr,alpha=0.5)
}
Уступая:
Я изменил интересный ответ от cuttlefish44, чтобы получить это - см. Эту ссылку: введите описание ссылки здесь
Также есть qmesh3d
Ответ от dww там, что вы можете изменить таким же образом, чтобы получить mesh3d, если это то, что вы действительно хотите, но я подумал, что это более элегантно.
library(cluster)
xyz <- cbind(rnorm(10), rnorm(10), rnorm(10))
e <- ellipsoidhull(xyz)
A <- e$cov
center <- e$loc
r <- sqrt(e$d2)
library(Rvcg)
sphr <- vcgSphere()
library(rgl)
ell <- translate3d(
scale3d(
transform3d(sphr, chol(A)),
r, r, r),
center[1], center[2], center[3])
shade3d(ell, color="red", alpha=0.3)
points3d(xyz)