Участок указанной области поверхности сетки с цветом - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть данные для трехмерной сетчатой ​​поверхности.Данные доступны здесь , где vb.xlsx содержит координаты для 7160 трехмерных вершин, а it.xlsx содержит информацию о лице.Файл color coding.txt представляет собой матрицу 7160 * 1 с элементами 1 или 2. Я хочу, чтобы площадь поверхности (а не только вершины!), Окруженная вершинами, которые закодированы 1, отображалась другим цветом по сравнению с областями, покрытыми вершинами.закодированный 2.

Например, если вершины, покрывающие нос и верхнюю губу, закодированы 1, а другие области лица закодированы 2, то я хочу построить график, как показано ниже:

enter image description here

, где площадь поверхности носа и верхней губы зеленая, а остальные области серые.

Мой код для создания серой сетки трехмерной поверхности лица выглядит следующим образом:

library(geomorph)
library(xlsx)
library(rgl)

# Import data
vb <- read.xlsx("E:\\...\\vb.xlsx", sheetIndex = 1, header = F)
it <- read.xlsx("E:\\...\\it.xlsx", sheetIndex = 1, header = F)

vb_mat <- t(as.matrix(vb))
vb_mat <- rbind(vb_mat, 1)
rownames(vb_mat) <- c("xpts", "ypts", "zpts", "")

it_mat <- t(as.matrix(it))
rownames(it_mat) <- NULL

vertices <- c(vb_mat)
indices <- c(it_mat)

try <- tmesh3d(vertices = vertices, indices = indices, homogeneous = TRUE, material = NULL, 
               normals = NULL, texcoords = NULL)

try2 <- addNormals(try)

shade3d(try2, col="darkgrey", specular = "#202020")

Теперь я хочу построить площадь поверхности, содержащую вершины с кодом 1 зеленого цвета, и область, содержащую вершины с кодом 2 розового цвета.Как мне изменить мой код R?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Сложность при окраске поверхностей заключается в том, чтобы решить, как использовать цвета.Вы можете раскрасить по вершине, по краю или по лицу.Вы хотите сделать это по вершине.

Пока вы используете rgl версию 0.100.2 или новее, это относительно просто.Укажите цвета по одному на вершину и используйте аргумент meshColor = "vertices", чтобы сообщить rgl, что вы сделали.Например,

shade3d(try2, col=c("green", "pink")[col], meshColor = "vertices", specular = "#202020")

, что дает

screen capture

Эта версия rgl еще не включена в CRAN, но онадоступно на R-Forge и Github .

0 голосов
/ 28 декабря 2018

Это ожидаемый результат?

library(rgl)
library(readxl)
# Import data
vb <- read_xlsx("vb.xlsx", sheet = 1, col_names = FALSE)
it <- read_xlsx("it.xlsx", sheet = 1, col_names = FALSE)
colorCoding <- read.table("Color coding.txt")$V1
colors <- c("darkgrey","midnightblue")[colorCoding]

vb_mat <- rbind(t(as.matrix(vb)), 1)
rownames(vb_mat) <- c("xpts", "ypts", "zpts", "")
it_mat <- t(as.matrix(it))
rownames(it_mat) <- NULL
vertices <- c(vb_mat)
indices <- c(it_mat)

mesh <- addNormals(
  tmesh3d(vertices = vertices, indices = indices, homogeneous = TRUE,
          material = list(color=colors)))
shade3d(mesh, specular = "#202020")

enter image description here

...