ЗАКРАШИВАНИЕ КОНТУРОВ
ЗАКРАШИВАНИЕ КОНТУРОВ
число 8. Линии получаются по-разному сдвинутыми
относительно друг друга. Последнее станет яснее, если выполнить
несколько раз приведенный выше пример, заменяя в 40-й строке число 130
на 131, 132 и т. д. вплоть до 138.
♦FBOX — единственный оператор
заливки, работающий столь необычным образом. Ко всем прочим операторам
этого раздела ♦GPAT никакого отношения не имеет.
Если возникает необходимость закрасить контур
произвольной формы, его надо сначала построить. Для этого можно
воспользоваться как средствами стандартного Бейсика, так и операторами
PRO-DOS. Если применяются последние, то нужно следить, чтобы они
«рисовали» обязательно сплошными линиями, иначе заливка
«просочится» сквозь контур. Во избежание неприятностей
перед экспериментами с заливкой лучше установить режим рисования
сплошной линией, вгедя прямо с клавиатуры *GPAT 255.
*FILL х, у
выполняет сплошную (не текстурную) заливку.
Параметрами х и у задается координата любой точки внутри закрашиваемого
контура. Попытка указать координаты точки, расположенной за пределами
замкнутого контура, приведет к сообщению об ошибке (это замечание
относится ко всем операторам заливки). Продемонстрируем работу
оператора *FILL следующей программой: 30 ♦BOX 30, 70, 140, 100:
REM Прямоугольник 40 *ELLIPSE 50, 50, 45, 30: REM Перекрывающий его эллипс 50 *FILL 80, 80: REM Сплошная заливка 60 PAUSE 0
Простейшим ич операторов, позволяющих выполнять текстурную заливку контура, является
Рис. 8. Заливка оператором ♦ PAINT.
♦PAINT х, у
Формат его совпадает с форматом оператора
*FILL. Заменим в последнем примере FILL на ♦PAINT, оставив все
прочее без изменений. Когда программа отработает, мы увидим ровный, но
не слишком оригинальный узор (рис.8). Получить другой узор с помощью
*PAINT, увы, невозможно.
Более универсальными в группе операторов, выполняющих заливку, являются ♦HATCH и *МАТСН.
♦HATCH х, у, addr
позволяет заливать замкнутые контуры любым узором с периодом трансляции 8 пикселей по вертикали и 8 по горизонтали.
Первые два параметра (х, у) задают координаты
любой точки внутри контура (как в ♦FILL и *PAINT). Третий (addr)
— адрес (0...65535) начала 8-байтовой области памяти, где
закодировано изображение некоего символа. Этим символом и будут
заполнены все знакоместа (8x8 пикселей) внутри контура. В знакоместах,
пересеченных контуром, прорисовывается лишь часть символа, попавшая
вовнутрь контура.
Изображение символа формируется стандартным для
ZX Spectrum способом, поэтому создавать текстуру для заливки Вы можете
сами. Для этих целей удобно пользоваться областью символов,
определяемых пользователем (UDG), где после включения компьютера
размещаются изображения прописных латинских букв от А до U. Выполним
программу:
30 *ВОХ 30, 70, 140, 100 40 ^ELLIPSE 50, 50, 45, 30 50 *НАТСН 80, 80, USR "Р" 60 PAUSE 0
Контур будет заполнен буквами Р, изображение
которых хранится в 8 ячейках памяти, начиная с адреса 65488 (значение,
возвращаемое функцией USR "Р"). Изменяя эти 8 байт, можно создать любую
текстуру. Оригинальные узоры получаются, если подставлять в оператор
*НАТСН произвольные адреса памяти ZX Spectrum (например, адреса в ПЗУ).
Замените в примере USR "Р" на 0, 1, 2 и т. д. и посмотрите, что
получится.
Интересно также взглянуть, что произойдет, если
воспользоваться оператором *НАТСН там, где он один раз уже отработал,
то есть попытаться «перекрасить» залитый контур:
30 *ВОХ 30, 30, 140, 100 40 +ELLIPSE 50, 50, 45, 30 50 +НАТСН 80, 80, USR "Р" 60 * HATCH 80, 80, USR "Т": REM Заменится ли текстура? 70 PAUSE 0
Не правда ли, это не совсем то, что мы ожидали
(рис.9)? При повторной заливке текстуры наложились одна на другую
необычным образом.
ITIPiririFiriririFiririr
Рис. 9. «Перекраска» текстуры оператором *НАТСН.
'fffffffffi " fffffft —fffffi ffffft jfffffi ^FFFFT fffffi
Полностью заменить текстуру (то есть предварительно стереть предыдущую) можно, выполнив оператор
♦MATCH addr
Его действие относится к контуру, который
последним был закрашен с помощью оператора *НАТСН (но не *PAINT и не
♦FILL). Проверим это, заменив в предыдущем примере строку 60 на
60 *МАТСН USR "Т": REM Теперь точно зальетсяI
Вот теперь, действительно, произошла смена текстуры (рис. 10).