Точки и их адреса
Использование CallWln
В примере 3.5. показано, как можно поместить точку белого цвета в центр экрана. Будем считать, что переменные Horsize и versize содержат количество точек на экране по горизонтали и вертикали, белый цвет имеет код 0Fh, а регистр es содержит код сегмента видеобуфера.
Пример 3.5. Вывод белой точки в центр экрана.
mov dx, versize; количество точек по вертикали shr dx, 01; уменьшаем в 2 раза mov ex, horsize; количество точек по горизонтали shr сх, 01; уменьшаем в 2 раза call CallWin; устанавливаем окно и адрес mov al, OFh; помещаем в al код белого цвета mov es:[di], al; рисуем точку ; продолжение программы
Адреса каждой точки вычисляются тем или иным способом при любой работе с графическими объектами – от вывода на экран заранее подготовленного рисунка до построения сложных геометрических фигур. Поэтому эффективность любого алгоритма, предназначенного для работы с графикой, во многом зависит от того, как организована работа с адресами точек.
Наибольшее время занимает вычисление адреса каждой точки по значениям ее координат. Поэтому процедуры типа Caiiwin используются только для нахождения адресов опорных точек, начиная с которых производится построение изображения. Например, такой точкой может быть левый верхний угол прямоугольной области, в которой должен располагаться рисунок.
Адреса остальных точек изображения вычисляются упрощенными способами, в основе которых лежат рекуррентные соотношения, связывающие значения координат или адресов текущей и следующей точек.
Смежные точки и их адреса
Смежные точки расположены на экране монитора рядом друг с другом. Если опорная точка не лежит на границе экрана, то ее окружает 8 смежных точек. Их расположение показано в левой части табл. 3.3, где опорной является точка с номером 0. В правой части таблицы приведены приращения адресов видеопамяти смежных точек относительно адреса опорной точки. Для вычисления адреса смежной точки к опорному адресу прибавляется смещение, указанное в соответствующей ячейке таблицы. Буква b обозначает переменную Horsize.
Таблица 3.3. Расположение и адреса смежных точек.
Расположение точек | Приращения адресов | ||||
---|---|---|---|---|---|
8 | 6 | 7 | -1-h | -h | 1-h |
5 | 0 | 1 | -1 | 0 | 1 |
4 | 2 | 3 | h-1 | h | h+1 |
Замечание
Команды, выполняющие строковые операции, обязательно изменяют содержимое индексного регистра, поэтому после их выполнения он содержит адрес не текущей, а следующей точки. Аналогичная ситуация возникает и после выполнения цикла построения строки с использованием обычных команд. Поэтому при составлении программы разберитесь, какой именно адрес вы будете корректировать, – возможно, он уже увеличен на 1.
При применении рекуррентных формул вычисленный адрес может выходить за пределы текущего окна. Например, горизонтальная линия может быть нарисована в таком месте экрана, что коды ее точек расположатся в двух соседних окнах, случай редкий, но вполне реальный. В зависимости от длины вертикальной линии коды ее точек могут располагаться сразу в нескольких окнах. Это обстоятельство надо учитывать при работе с адресами и своевременно изменять номера текущих окон.