FloodFill в iPhone - PullRequest
       12

FloodFill в iPhone

5 голосов
/ 01 февраля 2011

Я очень новичок в разработке для iPhone.Я хочу создать приложение с использованием алгоритма FloodFill в iPhone.Я понятия не имею о FloodFill.Пожалуйста, объясните мне цель алгоритма FloodFill. Если вы дадите пример приложения для FloodFill (iPhone), это означает, что я действительно, очень счастлив.

Моя задача состоит в том, чтобы я хотел заполнить изображение цветом по частям.Это означает, что если я выбираю один цвет и нажимаю на определенную область изображения, это означает, что оно окрашивается в выбранный цвет.

Пожалуйста, помогите мне сделать это.

Редактировать: я не могу написать код для реализации алгоритма заливки для iPhone.

Ответы [ 3 ]

6 голосов
/ 01 февраля 2011

Это рекурсивный алгоритм, означающий, что он вызывает себя для выполнения меньших частей всего процесса.

Заполнение флудом начнется с одного пикселя.Затем он проверит четыре соседних пикселя (вверх, вниз, влево, вправо).Для любого из этих четырех пикселей, которые имеют тот же цвет, что и тот, с которого мы начали, это вызовет другую заливку, начиная с этого пикселя.

Представьте себе маленькую картинку где.один цвет, а X другой цвет.Цифры приведены только для справки, поэтому 7,0 вверху справа.(Не обращайте внимания на подсветку синтаксиса красного / черного!)

 01234567
0........
1.XXXX...
2.X..X...
3.X...X..
4.XXX..X.
5...X..X.
6...XXX..
7........

Теперь представьте, что вы начинаете заливку с 3,3.Это изменит 3,3 на новый цвет.Затем он проверит, вниз, влево, вправо.Для up (3,2) цвет там такой же (точка), поэтому он начнет другую заливку оттуда.Для down (3,4) цвет отличается, поэтому эта ветвь остановится.Левый (2,3) и правый (4,3) также одинаковы (точка), поэтому оттуда начинается больше ветвей заливки.

Скажем, новый цвет - O, поэтому мытеперь есть это:

 01234567
0........
1.XXXX...
2.X.OX...
3.XOOOX..
4.XXX..X.
5...X..X.
6...XXX..
7........

Ветвь "вверх" начала новую заливку из (3,2)Отсюда вверх X, так что останавливается.Право - это X, то есть остановка, вниз - это О, то есть остановка, но влево (2,2) - это то же самое (точка), поэтому он начинает новую заливку оттуда.

Аналогично«Правая» ветвь от первоначальной заливки началась с (4,3).Единственная ветвь, которую он может использовать - вниз (4,4).Теперь у нас есть это:

 01234567
0........
1.XXXX...
2.XOOX...
3.XOOOX..
4.XXXO.X.
5...X..X.
6...XXX..
7........

И поэтому заливка продолжается от (4,4), ветвясь вправо и вниз.Одна из этих двух ветвей затем перейдет в (5,5).К тому времени больше не будет возможных ветвей.

И это мой обеденный перерыв:)

3 голосов
/ 03 февраля 2011

Это очень любопытный вопрос.Вы имеете в виду:

  1. "заполненный наводнением" многоугольник?Где многоугольник означает что-либо от тривиальных многоугольников вплоть до сложного наполнителя произвольного полигона четного / нечетного правила (где многоугольник может быть определен путями кривой Безье)?

  2. Алгоритм типа "выбрать точку и заполнить заливкой"?Вроде как старый инструмент заливки "can can", который вы видите (ну, по крайней мере, вы привыкли видеть, это было давно) в программах рисования (я думаю, что эра MacPaint / Deluxe Paint эпоха здесь).Эти алгоритмы варьируются в любом месте от тривиальной 2D плоскости пикселей, которые «останавливаются», когда достигают «края» (обычно другого «цвета», чем тот, с которого началась заливка), вплоть доочень сложные алгоритмы автоматического определения краев, которые вы можете увидеть в программах для рисования и обработки фотографий (например, PhotoShop).

Я предполагаю, что вы не ищете ни одного из тривиальных случаев, потому что ... ну, у вас, вероятно, есть другие орехи, которые вам нужно взломать, прежде чем пытаться взломать этот.

Итак, в случае # 1 вывероятно, следует начать с чтения документации .Mac OS X / iOS имеет чрезвычайно сложный API-интерфейс для 2D-графики, в значительной степени основанный на модели рендеринга PDF / PostScript.CoreGraphics / Quartz автоматически выполнит «заливку» для вас, и вы можете сделать это на уровне кривых Безье для загрузки.

В случае # 2 вам, вероятно, следует начать с , читаяточно такая же документация .Возможно, вам все равно придется взаимодействовать с ним на этом уровне.Однако программируемые шейдеры OpenGL + могут быть лучшим выбором, в зависимости от того, насколько сложным вы хотите, чтобы ваше «автоматическое» обнаружение краев было.Но по моему опыту, люди, которые напрямую бьют по трубе рендеринга, обычно довольно хорошо разбираются в фундаментальных алгоритмах, используемых при манипулировании пиксельными данными, поэтому я подозреваю, что этот метод может не подойти вам.

Смешивание CoreGraphics и OpenGL в одном и том же контексте - немного продвинутая техника, поэтому вам, вероятно, придется выбрать CoreGraphics или OpenGL в качестве основного API рендеринга.Тем не менее, CoreGraphics также имеет несколько довольно продвинутых и изящных API для выполнения того же типа вещей, но это выходит далеко за рамки базового использования CoreGraphics API (но вы найдете всю информацию, просмотрев различную графическую документацию iOS, которая одновременнообширный и очень хорошо задокументированный).

2 голосов
/ 03 февраля 2011

Вы должны следовать программе , чтобы написать свои собственные реализации.

Надеюсь, это поможет.

...