首先,这个问题与特定语言无关——我使用 Haxe 来定位多个平台——所以伪代码就足够了。
这是我的问题:我有这种形式的稀疏矩阵描述:
edges =
[
1,1,2,1,3,1,4,1,
2,2,3,2,
3,3,4,3,5,3,
4,4,5,4,6,4,
5,5,6,5,7,5,25,5,27,5,28,5,29,5,30,5
];
这描述了边缘关联:
- 点 1 与点 1、2、3 和 4 相关联
- 第 2 点与第 2 点和第 3 点相关联
- 第 3 点与第 3、4 和 5 点相关联
- 第 4 点与第 4、5 和 6 点相关联
- 第 5 点与第 5、6、7、25、27、28、29 和 30 点相关联
现在我需要在 3D 中渲染它,为此,我需要将数据“压缩”到没有“间隙”的索引缓冲区中。用上面的例子说,我需要得到:
newEdges =
[
1,2, 1, 3, 1, 4,
2,3,
3,4, 3,5,
4,5, 4,6,
5,6, 5,7, 5,8, 5,9, 5,10, 5,11, 5,12
]
因此,必须删除连接自身的边缘(边缘 1-1、2-2、3-3 等)(简单)。
由于点顺序并不重要(边缘 1-2 = 边缘 2-1),我们还将删除重复的边缘(很容易)。
现在棘手的部分是消除“差距”:因为 7 是最高连续值,而 25 是紧随其后的值,所以 25 必须变为 8,27 必须变为 9,28 必须变为 10,依此类推。
现在我使用的是 BitmapData,在其中我将所有值绘制为 XY 坐标。然后我递归地将这个位图的非空垂直条纹(1像素宽的矩形)复制到一个临时位图中。然后我对水平条纹做同样的事情,最后扫描我的位图并将像素的 X 和 Y 值存储为边缘的 ID。
并且它有效!(至少它似乎是:))但是开销很糟糕,并且取决于输入矩阵,我可能无法生成位图(例如,flash 限制为最大 4092 像素,JS 不很好地支持copyPixels)。
所以问题是你将如何在没有位图和语言特定方法的情况下进行这种“间隙消除”?
希望这足够明确,感谢您的关注。
尼古拉斯