DonNews #11
21 апреля 2000

Кодинг - Заливка замкнутой области на экране.

──────────────────────────────────────────
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




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
3BM Openair - ЭВМ openair - это международное пати по факту, собравшее сценеров из 2 стран и 5 городов.
Информацриум - Обзор журналов и книг об Амиге.
От редактора - я сделал несколько заказов по почте. Это во-пеpвых GENERAL SOUND у NEMO.

В этот день...   17 ноября