10.5.3. Рекурсивное закрашивание области Для внутренне-определенной области, показанной на рис. 10.23: О Изобразите «дерево вызовов процедуры» для случая, когда в качестве начального используется пиксел (4, 2). Иначе говоря, нарисуйте дерево, каждый узел которого содержит адрес пиксела, проверяемого посредством оператора if(getPixeK)…), как показано в листинге 10.6. В случае успешной проверки порождаются четыре поддерева вызовов процедуры.
10.5. Определение и заполнение областей из пикселов О Чему равна «глубина» этого дерева вызовов?
О Какое расположение четырех внутренних пикселов является для данного алгоритма наихудшим - в том смысле, что приходится делать наибольшее количество рекурсивных вызовов процедуры?
10.5.4. Использование мозаичного мотива Нарисуйте узоры, генерируемые следующими последовательностями бит:
11110101 1000 01101010 1100 01100101 1110 11111010 1111
при выкладывании каждого из них на большую область. Придумайте три других мозаичных мотива четыре на четыре и создайте интересные узоры.
10.5.5. Перетаскивание области Некоторые системы рисования позволяют пользователю сдвигать положение области с помощью мыши. После отпускания кнопки мыши область перерисовывается заново в новой позиции. Если эта область заполнена мозаикой, то всегда ли эта мозаика появится внутри области в том же виде? Мотивируйте свой ответ.
10.5.5. Использование связности: заполнение области на основе серий пикселов С целью увеличения производительности вышеприведенных алгоритмов и для предотвращения переполнения стека рассмотрим более тонкий подход к заполнению области - не пиксел за пикселем, а целыми группами пикселов, объединенных в серии. Серия (run) - это группа соседних пикселов, лежащих на одной строке развертки. Если мы сможем обнаружить и закрасить за один раз целую серию внутри области, то мы радикально ускорим процесс заполнения.
Чтобы изучить работу этого серийно-ориентированного метода, рассмотрим гранично-определенную 4-связную область, изображенную на рис. 10.25, а. Буквой s на рисунке обозначен начальный пиксел. Первой закрашивается серия от а до Ь, содержащая пиксел s. Затем сканируется строка, лежащая выше текущей, от а до Ъ - с целью нахождения дополнительных серий из внутренних пикселов. Одна такая серия обнаружена, и ее крайняя правая точка с сохраняется для дальнейшего использования (то есть ее адрес помещается в стек). Затем сканируется строка ниже текущей, также от а до Ь; найдена внутренняя серия и ее крайний правый пиксел d записывается в стек. На рис. 10.25, б показано положение в этот момент.