寻找相邻的节点

时间:2016-01-17 21:22:00

标签: javascript algorithm dictionary

我有一系列多边形,用3个vector3对象表示。即:

{
  "a": [1,2],
  "b": [3,4],
  "c": [5,6]
}

其中a,b,c是三角形的三个点,而索引的0,1分别是x,y

如果这个对象在一个数组中,有50个左右的其他三角形,每个三角形都有一个共享的顶点,我可能运行什么算法来创建某种兄弟三角形索引数组?

1 个答案:

答案 0 :(得分:1)

如果要查找共享公共顶点的三角形,请创建一个对象,其键是顶点,其值为三角形数组或数组或三角形对象中的索引/键。

假设您有一组不会改变的三角形,您可以按该数组的索引存储三角形:

var tria = [
    {a: [1, 2], b: [3, 4], c: [0, 6]}, 
    // more triangles ...
];

var adjacent = {};

function addAdjacent(vertex, tria) {
    if (!(vertex in adjacent)) adjacent[vertex] = [];
    adjacent[vertex].push(tria);

}

for (var i = 0; i < tria.length; i++) {
    var t = tria[i];

    addAdjacent(t.a, i);
    addAdjacent(t.b, i);
    addAdjacent(t.c, i);
}

然后你可以在adjacent中查找顶点并获得一组连接的三角形。此函数告诉您两个三角形是否相邻。如果是,则返回公共节点,否则返回null

function isAdjacent(x, y) {
    var t = tria[x];

    if (t.a in adjacent && ~adjacent[t.a].indexOf(y)) return t.a;
    if (t.b in adjacent && ~adjacent[t.b].indexOf(y)) return t.b;
    if (t.c in adjacent && ~adjacent[t.c].indexOf(y)) return t.c;

    return null;
}

如果要查找具有共同边的三角形,也可以使用此方法。您的密钥由两个顶点组成。您必须找到一种方法来使顶点的排序唯一,这样边[1, 2], [5, 0]等效于它的反向[5, 0], [1, 2]。一种方法是将较小的顶点作为边的第一个点。 (较小的意思是具有较小x坐标的顶点,如果相等,则n指向具有较小y坐标的顶点。)