给定一个网格面,找到它的相邻面
Posted
技术标签:
【中文标题】给定一个网格面,找到它的相邻面【英文标题】:Given a mesh face, find its neighboring faces 【发布时间】:2016-01-09 11:03:21 【问题描述】:我正在尝试有效地找到给定面孔的所有相邻面孔。 我采取了一种狡猾的方法,但我想知道是否可以改进。
到目前为止,我采用的方法是在创建网格几何体后创建数据结构。我构建了一个数组哈希来将顶点映射到由它们组成的面:
var vertexToFace = [];
function crossReference(g)
for (var fx = 0; fx < g.faces.length; fx++)
vertexToFace[fx] = new Array();
for (var fx = 0; fx < g.faces.length; fx++)
var f = g.faces[fx];
var ax = f.a;
var bx = f.b;
var cx = f.c;
vertexToFace[ax].push(fx);
vertexToFace[bx].push(fx);
vertexToFace[cx].push(fx);
现在我有了数组的哈希值,我可以检索给定面孔的邻居:
var neighbors = [];
neighbors.push( vertexToFace(face.a), vertexToFace(face.b), vertexToFace(face.c) );
这很好用,但我想知道它是否过度杀戮。我知道geometry.faces 中的每个面都包含成员a、b、c,它们是geometry.vertices 的索引。
我不相信反向信息被存储了,虽然很吸引人的是,geometry.vertices 中的每个顶点都有成员 .index,但它似乎并不对应于面。
我是否遗漏了一些明显的东西?
谢谢/。
【问题讨论】:
【参考方案1】:我认为
for (var fx = 0; fx < g.faces.length; fx++)
vertexToFace[fx] = new Array();
应该改为
for (var fx = 0; fx < g.vertices.length; fx++)
vertexToFace[fx] = new Array();
否则,如果顶点数大于面数,vertexToFace
中似乎将没有足够的元素。您还可以使用
vertexToFace[fx] = [];
【讨论】:
【参考方案2】:对我来说,这取决于您的用例。如果您只想这样做一次,那么对我来说这确实是矫枉过正,我只会遍历面孔以找到邻居。用复杂性术语来说,成本是 O(#G) #G 是面数。所以还不错。下次你这样做的成本将再次是 O(#G)。
在您的情况下,创建结构的成本是 O(#G),然后用于检索邻居,它取决于数组实现,但可能是 O(log(#V)),其中 #V 是顶点数。所以第一次检索成本是 O(#G+log(#V)) 所以 > O(#G) 但是下一次检索又是 O(log(#V)) 所以如果你有很多这些检索操作,它似乎会做在大多数情况下使用你的方式是有意义的。但是,您需要跟踪几何图形何时更改,因为这会使您的结构无效。所以经常 - 这取决于......
只是一个旁注 - 问题也是你认为的邻居。一个共同的顶点或边缘......只是提到它,因为我只是有一个案例,它是后者。
【讨论】:
以上是关于给定一个网格面,找到它的相邻面的主要内容,如果未能解决你的问题,请参考以下文章
当我在网格/面中实现索引时,为啥它会返回 OpenGL 错误?