Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2014, 10:09   #11
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Интересный метод. Попробую сегодня Ещё нагуглил волновой алгоритм. Если водна будет идти в 4 стороны, исходя из точки клика, то вполне успешно можно будет добиться и скорости и результата, когда волна дойдет до берегов озера(1) в земле(0), подсветить края земли. НО это пока теория..
Быстрее идеи предложенной blackstrip ничего не существует (ибо в пределе метод blackstrip даёт строгий O(1)). Сама суть идеи blackstrip в смещении баланса память\скорость в сторону занимаемой памяти - чем больше обсчитаем заранее, тем меньше делать потом =-)

Атлас - это картинка на которую мы собираем другие каритнки. То, что у вас показано изначально. Итого, алгоритм на словах у нас такой:
1) выкладываем на атлас исходные изображения так, чтобы их баундбоксы не пересекались;
2) готовим маску размером с атлас, заливаем её нулём;
3) идем по каждому пикселю атласа, везде пускаем "волну". Задача "волны" - вывести на маску объект цветом "номер объекта". Соответственно запускается волна только если в этой точке маска равна нулю и исходник не равен выбранному ключу. Наша "волна" должна еще обрисовать баундбокс (x, y, width, height) и занести эти данные в некий массив\лист (по индексу "номер объекта")

Теперь пред-процессинг можно считать завершенным. Если юзер куда-то сунулся мышой, то делаем так:
1) Смотрим на маске цвет пиксела, это наш "номер объекта"
2) С массива по номеру вытягиваем баунд бокс
3) Блиттим указанный регион маски в некий temp, меняем "номер объекта" на чистый белый
4) Этот temp рисуем в некий contour 8 раз со всевозможными смещениями (+-1 по x,y)
5) Размываем contour, если есть желание
6) При необходимости вычитаем из contour temp
7) Если не вычитали, то рисуем сначала contour (там у нас залитый силует), а поверх уже блиттим регион с исходного атласа. Красим контур стандартным субстрактом (dest_color = src_color - ($FFFFFFFF - user_color))
Если чувствуем провал по производительности (а его быть не должно, но мало ли), то придется где-нибудь хранить и контуры.

PS: атлас может быть размечен на регионы заранее хардкодом, либо к нему может идти некий сопроводительный конфиг - в случае кастомизации гуя, это обычное дело.
StriderX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм поиска Sylar9 Общие вопросы C/C++ 0 03.04.2012 12:38
A* алгоритм поиска Nicko_mt Помощь студентам 2 04.10.2011 02:24
алгоритм поиска незнайка_на_земле Помощь студентам 4 08.03.2011 10:46
Алгоритм поиска!!!! vit1990 Помощь студентам 14 29.01.2011 21:18
Алгоритм поиска... Johnson Общие вопросы Delphi 1 26.10.2008 08:35