2

我使用cluster包中的 ellipsoidhull 方法从一组点中获取包围椭圆体 (mvee) 的最小体积。此方法返回类椭球的对象。我需要绘制生成的椭球。我尝试使用rgl包中的 wire3d 方法来绘制椭圆体,但此方法获取 mesh3d 类的对象作为输入参数。如何将椭圆体对象转换为 mesh3d 对象?

4

2 回答 2

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,但我认为这更优雅。

于 2017-03-15T10:52:14.390 回答
1
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)

在此处输入图像描述

于 2018-08-18T08:07:00.643 回答