Иллюстрированный самоучитель по SVGA

Прямоугольники

Рисование контура прямоугольника

Контур прямоугольника состоит из двух горизонтальных и двух вертикальных линий, поэтому для его рисования понадобятся подпрограммы horiine и anyline, описанные в предыдущем разделе. Прежде чем рассматривать подпрограмму, обсудим, как можно нарисовать контур прямоугольника с минимальными затратами на вычисление адресов начала его граней (сторон).

Будем считать, что опорной точкой является верхний левый угол контура, адрес которого известен. Если грани прямоугольника рисовать, например, в таком порядке – верхняя, правая, нижняя, левая, то вычислять адреса начала граней вообще не потребуется. Однако в таком случае понадобятся не две, а четыре подпрограммы. При рисовании верхней и правой граней адреса видеопамяти будут изменяться в естественном порядке в сторону их увеличения и можно использовать подпрограммы horline и anyline. При рисовании же нижней и левой граней адреса видеопамяти будут изменяться в сторону их уменьшения и понадобятся еще две подпрограммы, рисующие линии в обратном направлении. Чтобы ограничиться двумя подпрограммами, изменим последовательность рисования граней.

Сначала рисуем верхнюю и правую грани, затем возвращаемся в левый верхний угол контура прямоугольника и рисуем левую и нижнюю грани. Можно сначала нарисовать левую и нижнюю грани, а затем верхнюю и правую. В обоих случаях при рисовании граней адреса видеопамяти изменяются в сторону их увеличения.

В примере 3.14 приведена подпрограмма, рисующая сначала верхнюю и правую, а затем левую и нижнюю грани. Входные параметры для нее совпадают с параметрами подпрограммы примера 3.13.

Пример 3.14. Подпрограмма рисования контура прямоугольника.

round: PushReg <bx,Cur win,cx,di> ; сохранение исходного состояния
mov ex, dx ; ex = ширина прямоугольника
   
dec ex уменьшаем ширину на 1
call horline рисуем верхнюю грань
mov bx, horsize bx = horsize
pop ex восстанавливаем содержимое сх
push ex и сохраняем его в стеке
call anyline рисуем правую грань
PopReg <di,cx,Cur win> восстанавливаем исходное состояние
PushReg <Cur win,cx,di> и вновь запоминаем его
call SetWin устанавливаем исходное окно
dec ex уменьшаем высоту на 1
call anyline рисуем левую грань
mov ex, dx сх = ширина прямоугольника
call horline рисуем нижнюю грань
PopReg <di,cx,Cur win,bx> восстановление исходного состояния
call SetWin восстановление исходного окна
ret возврат из подпрограммы

Выполнение примера 3.14 начинается с сохранения в стеке переменной cur_win и регистров bx, сх и di. При вызове подпрограммы переменная Cur_win и регистр di задают адрес левого верхнего угла контура прямоугольника, а в регистре сх указывается высота прямоугольника (количество точек по вертикали).

При рисовании верхней грани ее размер сокращается на 1 точку, для того чтобы при возврате из подпрограммы horline в регистре di находился адрес первой точки правой грани. Правую грань рисует подпрограмма anyline, поэтому в регистр bx надо записать значение Horsize, а из стека восстановить и тут же снова сохранить в нем содержимое регистра сх. После возврата из подпрограммы anyline будут нарисованы верхняя и правая грани.

Теперь надо вернуться в левый верхний угол контура прямоугольника, восстановив исходное состояние, сохраненное в стеке, и заново сохранить его для использования при выходе их подпрограммы. Кроме того, восстанавливается исходное окно (команда call setwin), поскольку оно могло измениться при рисовании.

При рисовании левой грани ее размер сокращается на 1, благодаря этому при возврате из подпрограммы anyline регистр di содержит адрес первой точки нижней грани. В данном случае записывать в регистр bx значение Horsize не требуется, поскольку оно было записано туда раньше. После возврата из подпрограммы anyline в регистре сх указывается ширина прямоугольника, и подпрограмма horline рисует нижнюю замыкающую грань. Остается восстановить сохраненные величины, исходное окно видеопамяти и выполнить возврат из подпрограммы.

Описанная подпрограмма рисует прямоугольный контур, ширина граней которого равна одной точке. Если грани должны быть более широкими, то можно нарисовать несколько вложенных прямоугольных контуров так, чтобы получить грани нужной ширины. Можно поступить иначе – нарисовать две вложенные прямоугольные области. Сначала рисуется большая область, цвет которой совпадает с цветом граней, а затем в ней меньшая область, имеющая цвет внутренней части прямоугольника.

Мы закончили рассмотрение способов рисования простых геометрических фигур. Если читателя интересуют способы рисования более сложных фигур, то рекомендуем обратиться к книге, в которой приведены некоторые алгоритмы и их теоретическое обоснование.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.