我试图有效地找到给定脸部的所有相邻脸部。 我采取了狡猾的方法,但我想知道是否可以改进。
我到目前为止采用的方法是在创建网格几何体后创建数据结构。我构建了一个数组哈希,将顶点映射到由它们组成的面上:
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,但它似乎并不对应于面。
我错过了一些明显的东西吗?
感谢/.
答案 0 :(得分:0)
我认为
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] = [];
答案 1 :(得分:0)
对我而言,这取决于您的使用案例。如果你只想做一次然后对我来说它确实和矫枉过正,我只是遍布各个面来寻找邻居。成本是O(#G)以复杂性来说话#G是面孔的数量。所以不错。下次你这样做的费用将再次为O(#G)。
在你的情况下,成本是O(#G)来创建结构然后用于检索邻居它取决于数组实现但可能是O(log(#V))其中#V是顶点数。因此,首先检索成本是O(#G + log(#V))所以&gt; O(#G)然而,下一次检索也是O(log(#V)),所以如果你有很多这些检索操作,在大多数情况下使用你的方式似乎是有意义的。但是,您需要在更改几何体时跟踪,因为这会使您的结构无效。所以经常 - 这取决于......
只是旁注 - 问题也是你认为的邻居。一个共同的顶点或边缘...只是提到它因为我只是有一个案例,它是后者。