У меня есть этот 2-мерный растр, на который наложены слои от 1 до 20 других 2-мерных растров (со случайным размером и смещением). Я ищу быстрый способ доступа к представлению под прямоугольником (со случайным размером и смещением). Представление должно возвращать все слоистые пиксели для каждой координаты X и Y.
Полагаю, это как-то так, скажем, GIMP или другие 2d-приложения рисования рисуют слои друг на друге, за исключением того, что я хочу, чтобы все пиксели располагались друг на друге, а не просто проекция, где верхний пиксель скрывает другой те, что под ним.
Я сталкивался с этой проблемой и раньше, и до сих пор делаю это сейчас, уже потратил много времени на поиск в интернете и здесь подобных проблем, но не могу их найти. Я опишу два возможных решения, оба из которых меня не устраивают:
Имеют в основном трехмерный массив предварительно выделенного размера. Этим легко управлять, но память тратится впустую, а объем памяти очень велик. Для 4K-растров, скажем, 16 слотов, по 4 байта в каждом, это как 1 ГБ памяти? А в случае применения большая часть этого пространства будет потрачена впустую, а не использована.
Мое решение, которое я принял раньше. Имеют два двумерных массива, один с индексами, другой с фактическими значениями. Каждый «пиксель» первого говорит, в каком диапазоне пикселей во втором массиве вы можете найти фактические пиксели, внесенные из всех слоев. Это хорошо сжато по размеру, но любой запрос переходит между двумя областями памяти и немного затрудняет настройку, не говоря уже об обновлении (приятно иметь функцию, но не обязательно).
Итак ... есть какие-нибудь ноу-хау для решения такой проблемы? Заранее спасибо!
Забыл добавить, что я нацеливаюсь на самодостаточное, желательно однопоточное, процессорное решение. Слои, скорее всего, будут иметь оттенки серого с альфа-каналом (то есть определенные пиксельные данные не будут существовать). Операция поиска является приоритетной, такие обновления, как добавление / удаление слоя, могут выполняться медленнее.
Добавлено пользователем Mark (см. Комментарий):
На этом изображении, если взять верхний левый угол красного прямоугольника, поиск должен сообщать о красном, зеленом, синем и черном. Если выбран нижний правый угол, он должен отображать только красный и черный.