我想根据与顶点的接近程度在三角形RGL网格上给面着色。
问题是,似乎很多时候顶点都与距实际顶点位置本身很远的面相关联,这在我要为一个顶点周围的面着色时会产生问题。脸最终离重心的位置很远。
我现在正在做的是这样:
计算网格中所有面的重心。
使用FAR包计算与所需点最接近的n个重心。保留这些索引。
基于收集的索引,为那些面孔着色某种颜色。其余的脸将变成白色。
colors=rep('white',num_faces)
colors[colored_faces]='red'
mesh$material=list(color=colors)
plot3d(mesh)
这是网格当前的样子,红色是“彩色”面,蓝色是我希望在附近有彩色面的点。
更新:看到this,我的问题现已修改为:
如何找到最接近给定点的人脸?我仍然不清楚,因为人脸的重心有时会误导人,并且不能代表到给定顶点的实际距离。
更新2 :
我在此处添加了示例代码和文件:Files and code
基本上,代码使用最近的邻居算法找到同一3d网格的给定顶点的最近的面,然后我们在颜色矢量中对这些面进行着色(记住要对颜色进行4次着色):
除了,当我们运行该算法时,我们仅对形状的一侧进行着色:像这样: Odd
如何使着色更加对称?
更新3 :此问题已解决!请在Rforge上查看未发布的rgl版本,以获取最新的rgl版本,该版本可以为面,顶点和边缘着色。
更新4 :这是通过给最近的顶点着色来显示新图像(以表明新的rgl程序包可以实现奇观):
答案 0 :(得分:0)
您计算重心的代码不正确。你有
#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)
}
这只会删除vertices
数组的第四行,这是将齐次坐标转换为欧几里得坐标的错误方法。您确实需要将其他行除以第四行。您可以使用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)
那些细长的三角形的质心离您选择的点很远。