给定一个网格面,找到它的相邻面

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

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

【讨论】:

以上是关于给定一个网格面,找到它的相邻面的主要内容,如果未能解决你的问题,请参考以下文章

ANSYS如何选择两个相邻面

获取网格中的连续面

当我在网格/面中实现索引时,为啥它会返回 OpenGL 错误?

ThreeJS:在PlaneBufferGeometry中查找相邻面

数字几何处理

HalfEdge半边数据结构详解