首页 > 解决方案 > 在 3D 空间中绘制立方体

问题描述

我需要画一个大立方体,然后在 R 中将它分成 8 个较小的立方体。我需要在 3D 空间中绘制它,每个较小的立方体都有不同的颜色。我有大小立方体的顶点。以下是顶点:

type_cube <- c("type_8","type_8","type_8","type_8",
               "type_8","type_8","type_8","type_8",
               "type_7","type_7","type_7","type_7", 
                "type_7","type_7","type_7","type_7",
               "type_6","type_6","type_6","type_6",
               "type_6","type_6","type_6","type_6",
                "type_5","type_5","type_5","type_5",
               "type_5","type_5","type_5","type_5","
               type_4", "typ3_4","type_4","type_4",
               "type_4","typ3_4","type_4","type_4",
               "type_3","type_3","type_3","type_3",
               "type_3","type_3","type_3","type_3",
                "type_2","type_2","type_2","type_2",
               "type_2","type_2","type_2","type_2",
               "type_1","type_1","type_1","type_1",
                "type_1","type_1","type_1","type_1",
               "big_cube", "big_cube", "big_cube", 
               "big_cube", "big_cube", "big_cube", 
               "big_cube", "big_cube")


x <- c(0.0,0.0,0.5,0.5,0.5,0.0,0.0,0.5,0.5,1.0,1.0,0.5,0.5,0.5,
       1.0,1.0,0.0,0.5,0.5,0.0,0.0,0.0,0.5,0.5,0.0,0.5,0.5,0.0,0.0,0.5,
       0.0,0.5,1.0,0.5,0.5,1.0,0.5,0.5,1.0,1.0,1.0,0.5,0.5,1.0,
        0.5,0.5,1.0,1.0,0.0,0.5,0.5,0.0,0.0,0.5,0.5,0.0,1.0,1.0,
       0.5,0.5,0.5,0.5,1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0)

y <- c(0.0,0.5,0.5,0.0,0.0,0.0,0.5,0.5,0.0,0.0,0.5,0.5,0.0,0.5,0.5,
       0.0,0.5,0.5,1.0,1.0,0.5,1.0,1.0,0.5,0.0,0.0,0.5,0.5,0.0,0.0,
       0.5,0.5,0.5,0.5,1.0,1.0,0.5,1.0,1.0,0.5,0.0,0.0,0.5,0.5,0.0,
       0.5,0.5,0.0,0.5,0.5,1.0,1.0,0.5,0.5,1.0,1.0,1.0,0.5,0.5,1.0,
       0.5,1.0,1.0,0.5,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0)


z <- c(0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.0,0.0,0.0,
       0.0,0.5,0.5,0.5,0.5,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.5,0.5,
       0.5,0.5,0.5,0.5,0.5,0.5,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.5,
      0.5,0.5,0.5,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0,
      0.5,0.5,0.5,0.5,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0)

data <- data.frame(type_cube,x,y,z)

标签: rplot3ddraw

解决方案


这是我的做法。感谢 Jon Spring 将我引向正确的方向。

    type_cube <- c("type_8","type_8","type_8","type_8",
               "type_8","type_8","type_8","type_8",
               "type_7","type_7","type_7","type_7", 
               "type_7","type_7","type_7","type_7",
               "type_6","type_6","type_6","type_6",
               "type_6","type_6","type_6","type_6",
               "type_5","type_5","type_5","type_5",
               "type_5","type_5","type_5","type_5","
               type_4", "typ3_4","type_4","type_4",
               "type_4","typ3_4","type_4","type_4",
               "type_3","type_3","type_3","type_3",
               "type_3","type_3","type_3","type_3",
               "type_2","type_2","type_2","type_2",
               "type_2","type_2","type_2","type_2",
               "type_1","type_1","type_1","type_1",
               "type_1","type_1","type_1","type_1",
               "big_cube", "big_cube", "big_cube", 
               "big_cube", "big_cube", "big_cube", 
               "big_cube", "big_cube")


x <- c(0.0,0.0,0.5,0.5,0.5,0.0,0.0,0.5,0.5,1.0,1.0,0.5,0.5,0.5,
       1.0,1.0,0.0,0.5,0.5,0.0,0.0,0.0,0.5,0.5,0.0,0.5,0.5,0.0,0.0,0.5,
       0.0,0.5,1.0,0.5,0.5,1.0,0.5,0.5,1.0,1.0,1.0,0.5,0.5,1.0,
       0.5,0.5,1.0,1.0,0.0,0.5,0.5,0.0,0.0,0.5,0.5,0.0,1.0,1.0,
       0.5,0.5,0.5,0.5,1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0)

y <- c(0.0,0.5,0.5,0.0,0.0,0.0,0.5,0.5,0.0,0.0,0.5,0.5,0.0,0.5,0.5,
       0.0,0.5,0.5,1.0,1.0,0.5,1.0,1.0,0.5,0.0,0.0,0.5,0.5,0.0,0.0,
       0.5,0.5,0.5,0.5,1.0,1.0,0.5,1.0,1.0,0.5,0.0,0.0,0.5,0.5,0.0,
       0.5,0.5,0.0,0.5,0.5,1.0,1.0,0.5,0.5,1.0,1.0,1.0,0.5,0.5,1.0,
       0.5,1.0,1.0,0.5,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0)


z <- c(0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.0,0.0,0.0,
       0.0,0.5,0.5,0.5,0.5,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.5,0.5,
       0.5,0.5,0.5,0.5,0.5,0.5,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.5,
       0.5,0.5,0.5,1.0,1.0,1.0,1.0,0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0,
       0.5,0.5,0.5,0.5,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0)



##############################################

library(rgl)

c3d <- cube3d(color="#ffffff", alpha=0.5)  



#########################
# creating the cubes
# The original cube
c3d2 <- c3d %>% 
   translate3d(1, 1, 1)%>%scale3d(0.5, 0.5, 0.5)

shade3d(c3d2)

#type 1
c3d1 <- cube3d(color = "green", alpha=0.2) %>% 
   translate3d(3, 3, 3)%>%
   scale3d(0.25, 0.25, 0.25)
shade3d(c3d1)

#type 2 
c3d2 <- cube3d(color =  "#91682c", alpha=0.5) %>% 
   translate3d(1, 3, 3)%>%
   scale3d(0.25, 0.25, 0.25)
shade3d(c3d2)

#type 3 
c3d3 <- cube3d(color = "orange", alpha=0.5) %>% 
   translate3d(3, 1, 3)%>%
   scale3d(0.25, 0.25, 0.25)

shade3d(c3d3)


#type 4 
c3d4 <- cube3d(color = "cyan", alpha=0.5) %>% 
   translate3d(3, 3, 1)%>%
   scale3d(0.25, 0.25, 0.25)

shade3d(c3d4)


#type 5 
c3d5 <- cube3d(color = "#425e5b", alpha=0.6) %>% 
   translate3d(1, 1, 3)%>%
   scale3d(0.25, 0.25, 0.25)

shade3d(c3d5)

# type 6 
c3d6 <- cube3d(color = "yellow", alpha=0.7) %>% 
   translate3d(1, 3, 1)%>%
   scale3d(0.25, 0.25, 0.25)

shade3d(c3d6)

# type 7 
c3d7 <- cube3d(color = "blue", alpha=0.1) %>% 
   translate3d(3, 1, 1)%>%
   scale3d(0.25, 0.25, 0.25)

shade3d(c3d7)

# type 8
c3d8 <- cube3d(color = "#a4211c", alpha=0.9) %>% 
   translate3d(1, 1, 1) %>% 
   scale3d(0.25, 0.25, 0.25)
shade3d(c3d8)


#########################
# Text showing cube types
text3d(x=.75, y = .75, z = .75, "type 1", adj = 0.5, pos = NULL, offset = 0.5, col='black') 

text3d(x=.25, y = .75, z = .75, "type 2", adj = 0.5, pos = NULL, offset = 0.5, col='purple') 

text3d(x=.75, y = .15, z = .75, "type 3", adj = 0.5, pos = NULL, offset = 0.5, col='black') 

text3d(x=.75, y = .75, z = .1, "type 4", adj = 0.5, pos = NULL, offset = 0.5, col='black') 

text3d(x=.25, y = .15, z = .75,"type 5", adj = 0.5, pos = NULL, offset = 0.5, col='yellow') 

text3d(x=.25, y = .75, z = .1, "type 6", adj = 0.5, pos = NULL, offset = 0.5, col='black') 

text3d(x=.75, y = .15, z = .1, "type 7", adj = 0.5, pos = NULL, offset = 0.5, col='black') 

text3d(x=.25, y = .15, z = .1, "type 8", adj = 0.5, pos = NULL, offset = 0.5, col='black') 

#########################
# adding the axes

axes3d('x+-',  col='purple',pos = c(0, 1.1, 0),labels = c("0","","","","","Full Score"))

axes3d('y+-', col='green',pos = c(1.1, 0, 0),labels = c("0","","","","","Full Score"))

axes3d('z-+', col='blue',pos = c(0, 1.1, 0),labels = c("0","","","","","Full Score"))

在此处输入图像描述


推荐阅读