──────────────────────────────────────────
Disabler/DPL
Заливка замкнутой области на экране
Сегодня вам предстоит узнать о такой
вещи, как заливка. Сразу замечу, что зали-
вать будем не полигоны и прочее, а просто
замкнутую область на экране, причём об-
ласть может быть ограничена как единичны-
ми, так и нулевыми точками. Заливать будем
сплошным цветом, т. е. без текстуры (о за-
ливке текстурой будет сказано ниже).
Алгоритм заливки прост до безобразия и
вместе с тем работает довольно быстро.
Итак, пусть у нас есть замкнутая область
на экране (Рис. 1) и точка внутри этой об-
ласти с координатами X и Y.
■■■■■■■■■
■■■■■ ■■■■■ ■■■■
■ ■■ ■ ■■
■ ■(X,Y) ■ ■■
■ ■
■■■■ ■■
■■■■■■■■■■■■ ■■■■
■■■■■■■■■
Рис.1
Нам понадобятся два буфера размером 1024
байта каждый (на 512 точек). А теперь по
порядку:
1. Помещаем в буфер #1 координаты нашей
точки (X, Y) и запоминаем количество поло-
женных точек (в нашем случае - 1).
2. Берём точку из буфера #1 и помещаем
нулевые точки вокруг неё в буфер #2 и од-
новременно делаем их единичными. И так до
тех пор, пока не обработаем все точки из
буфера #1 (Рис. 2).
■■■■■■■■■
■■■■■ ■■■■■ ■■■■
■ ■ ■■ ■ ■■
■ ■■■ ■ ■■
■ ■ ■
■■■■ ■■
■■■■■■■■■■■■ ■■■■
■■■■■■■■■
Рис.2
3. Берём точку из буфера #2 и помещаем
нулевые точки вокруг неё в буфер #1 и од-
новременно делаем их единичными. Повторяем
для всех точек из буфера #2 (Рис. 3).
■■■■■■■■■
■■■■■ ■ ■■■■■ ■■■■
■ ■■■ ■■ ■ ■■
■ ■■■■■ ■ ■■
■ ■■■ ■
■■■■ ■ ■■
■■■■■■■■■■■■ ■■■■
■■■■■■■■■
Рис.3
4. Переходим к пункту 2.
Алгоритм завершается в том случае, если
в одном из буферов не окажется ни одной
точки.
Заливка текстурой
Заливка текстурой не отличается от
сплошной заливки буквально ничем, кроме
одного - понадобится буфер #3 размером
6144 байта.
Итак, поехали:
1. Копируем экран в буфер #3
2. Заливаем сплошной заливкой область на
экране.
Обрабатываем побайтно весь экран:
3. Бeрём байт экрана (scr), складываем
по xor с байтом из буфера #3. Таким обра-
зом получаем маску по которой будет накла-
дываться текстура (mask).
4. Бeрём старший байт текущего адреса
экрана и выделяем младшие три бита (and 7
или and %00000111) - это смещение относи-
тельно начала текстуры (textur).
5. Берём байт textur, инвертируем, дела-
ем and mask и xor scr,после чего ложим его
на место scr.
6. Увеличиваем адрес на единицу и пере-
ходим к пункту 3. И так 6144 раза.
P. S: Поставить точку на экране можно сле-
дующим образом:
; (c) 1996 Disabler/DPL
; A, C - Coordinates
point call 8880
add a,a
add a,a
add a,a
ld b,a
ld a,#fe
sub b
ld ($+4),a
set 0,(hl)
ret
P. P. S: В приложении есть исходняки, ре-
ализующие все вышеописанные алгоритмы.
See You, May Be!
Disabler 25.Feb'2000