Раскраска Rgl 3d сетка лица - PullRequest
       81

Раскраска Rgl 3d сетка лица

0 голосов
/ 21 сентября 2018

Я хотел бы раскрасить грани треугольной сетки RGL, основываясь на близости к вершине.

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

То, что я сейчас делаю, таково:

  1. Вычисляем барицентр всех граней всетка.

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

  3. На основе собранных индексов закрасьте эти лица определенным цветом.Остальные лица будут окрашены в белый цвет.

    colors=rep('white',num_faces) colors[colored_faces]='red' mesh$material=list(color=colors)

  4. Тогда я построю сетку: plot3d(mesh)
  5. Дело в том, что яя сейчас получаю очень странную окраску, есть ли какой-нибудь установленный способ закрасить грани, близкие к определенной координате / вершине?

Вот как выглядит сетка в данный момент, с красным цветом как «окрашенным».'лица, а синие - как точки, которые я хотел бы видеть рядом с цветным лицом.

Mesh

Обновление : с учетом this мой вопрос теперь изменен на:

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

Обновление 2 :

Я добавил пример кода и файл здесь: Файлы и код

В основном код находит ближайшие грани к заданной вершине той же 3d-сетки с помощью алгоритма ближайшего соседа, а затеммы окрашиваем эти грани в нашем цветном векторе (не забывая окрашивать цвета 4 раза):

За исключением случаев, когда мы запускаем этот алгоритм, мы окрашиваем только одну сторону формы: например, так: Odd

Как я могу сделать раскраску немного более симметричной?

Обновление 3 : эта проблема решена!Пожалуйста, посмотрите на неизданную версию rgl на Rforge, чтобы найти новейшую версию rgl, которая позволяет раскрашивать грани, вершины и ребра.

Обновление 4 : вот новое изображение, закрасив самые близкие вершины (чтобы показать, что новый пакет rgl творит чудеса):

Better Sink

1 Ответ

0 голосов
/ 24 сентября 2018

Ваш код для вычисления центроида неверен.У вас есть

#Function for computing the barycenter/centroid of a face.
compute_face_centroid=function(vertices,face){
  vertex=vertices[,face][-4,]
  centroid=apply(X=vertex,MARGIN = 1,FUN = mean)
  return(centroid)
}

Это просто удаляет 4-ую строку массива vertices, что является неправильным способом преобразования однородных координат в евклидовы.Вам действительно нужно разделить остальные строки на 4-й.Вы можете сделать это, используя функцию rgl asEuclidean:

#Function for computing the barycenter/centroid of a face.
compute_face_centroid=function(vertices,face){
  vertex <- asEuclidean(t(vertices[,face]))
  apply(vertex, MARGIN = 2, FUN = mean)
}

В вашем коде могут быть и другие проблемы, я еще не все проследил.

Кстати, неизданная тестовая версия rgl меняет способ обработки цветов в сетках, и, надеюсь, упростит эту часть вашего кода.Вы можете получить его на R-forge.r-project.org, если хотите попробовать.Теперь вы можете указывать цвета по вершине или по лицу.

Отредактировано, чтобы добавить:

Хорошо, теперь я посмотрел поближе.Я думаю, что ваш код действительно работал.compute_face_centroid следует исправить, но, поскольку в вашем примере всегда есть значение 1 для конечного компонента, удалить его можно.

Причина, по которой вы получили цвет, отличается от того, что вы ожидали, просто в том, что треугольники, составляющие вашСетка действительно различна по форме.Если вы построите изображение в виде каркаса, вы увидите следующее:

wire3d(file)

Центроиды этих длинных тонких треугольников довольно далеко от выбранной вами точки.

enter image description here

...