Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找相邻节点_Javascript_Algorithm_Dictionary - Fatal编程技术网

Javascript 查找相邻节点

Javascript 查找相邻节点,javascript,algorithm,dictionary,Javascript,Algorithm,Dictionary,我有一系列多边形,用3个矢量3个对象表示。即: { "a": [1,2], "b": [3,4], "c": [5,6] } 其中a、b、c是三角形的三个点,索引0,1分别是x、y 如果该对象在一个数组中,有50个左右的其他三角形,每个三角形都有一个共享顶点,那么我可以运行什么算法来创建兄弟三角形的索引数组?如果要查找共享一个公共顶点的三角形,创建一个对象,其关键点是顶点,其值是三角形数组或三角形数组或对象中的索引/关键点 假设您有一个不变的三角形数组,并按该数组的索引存储三角形:

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

{
  "a": [1,2],
  "b": [3,4],
  "c": [5,6]
}
其中
a、b、c
是三角形的三个点,索引
0,1
分别是
x、y


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

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

假设您有一个不变的三角形数组,并按该数组的索引存储三角形:

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);
}

如果要查找具有公共边的三角形,也可以使用此方法。然后,关键点由两个顶点组成。您必须找到一种方法使顶点的顺序唯一,以便边
[1,2],[5,0]
与其相反的边
[5,0],[1,2]
。一种方法是使较小的顶点成为边的第一个点。(较小表示x坐标较小的顶点,如果x坐标等于n,则两个点都指向y坐标较小的顶点。)

如果只有50个三角形,则不值得花时间对其进行过度设计。只需检查每一对并确定它们是否为同级/仅1个共享顶点或至少1个?你认为有可能找到具有共享顶点的同级三角形吗?@amit-大约有400多个三角形,使用50作为任意数字,这肯定是算法应该扩展的范围?但是是的,也许就像你说的,你需要优化分辨率,而不是暴力。但考虑到这一点,我需要这个手术尽快进行。
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;
}