我有一系列多边形,用3个vector3对象表示。即:
{
"a": [1,2],
"b": [3,4],
"c": [5,6]
}
其中a,b,c
是三角形的三个点,而索引的0,1
分别是x,y
。
如果这个对象在一个数组中,有50个左右的其他三角形,每个三角形都有一个共享的顶点,我可能运行什么算法来创建某种兄弟三角形索引数组?
答案 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坐标的顶点。)