给定网格面,找到其相邻面

时间:2015-10-12 04:10:32

标签: three.js mesh

我试图有效地找到给定脸部的所有相邻脸部。 我采取了狡猾的方法,但我想知道是否可以改进。

我到目前为止采用的方法是在创建网格几何体后创建数据结构。我构建了一个数组哈希,将顶点映射到由它们组成的面上:

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,但它似乎并不对应于面。

我错过了一些明显的东西吗?

感谢/.

2 个答案:

答案 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)),所以如果你有很多这些检索操作,在大多数情况下使用你的方式似乎是有意义的。但是,您需要在更改几何体时跟踪,因为这会使您的结构无效。所以经常 - 这取决于......

只是旁注 - 问题也是你认为的邻居。一个共同的顶点或边缘...只是提到它因为我只是有一个案例,它是后者。