【发布时间】:2012-10-12 09:35:33
【问题描述】:
首先,这个问题与特定语言无关——我使用 Haxe 来针对多个平台——所以伪代码就绰绰有余了。
这是我的问题:我有一个sparse Matrix 的这种形式的描述:
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)。
所以问题是,如果没有位图和特定语言的方法,您将如何进行这种“间隙消除”?
希望这足够明确, 感谢您的关注。
尼古拉斯
【问题讨论】:
标签: algorithm pseudocode sparse-matrix reindex