во-первых, этот вопрос не связан с конкретным языком — я использую 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 пикселей в качестве идентификаторов ребер.
и это работает! (по крайней мере, так кажется :)), но накладные расходы ужасны, и в зависимости от входной матрицы я могу просто не иметь возможности генерировать растровые изображения (например, flash ограничен 4092 пикселями максимум, JS не может очень хорошо поддерживают copyPixels).
поэтому вопрос в том, как бы вы сделали это «удаление пробелов» без растровых изображений и без метода, специфичного для языка?
надеюсь, что это было достаточно ясно, спасибо за внимание.
Николя