Ваш код для вычисления центроида неверен.У вас есть
#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](https://i.stack.imgur.com/CyyTC.png)