Координаты и адреса точек
Координаты и адреса смежных точек
Значения координат нужны для вычисления базового адреса видеопамяти, соответствующего некой опорной точке, как правило, левого верхнего угла, графического объекта. В процессе работы с объектом адреса остальных точек вычисляются упрощенным способом исходя из текущего значения адреса, т. е. учитывается зависимость приращения адресов от взаимного расположения точек на экране.
Если базовая точка не лежит на одной из четырех границ экрана, то ее окружает восемь смежных точек. В табл. 7.4 показаны приращения значений координат и адресов смежных точек. Базовая точка имеет координаты х, Y, а приращение ее адреса равно нулю. В правой части таблицы буква k соответствует переменной bytppnt, а буква w – переменной bperline.
Таблица 7.4. Приращения координат и адресов смежных точек.
Приращение смешанных координат | Приращение их адресов | ||||
---|---|---|---|---|---|
X-1.Y-1 | X, Y-1 | X+1.Y-1 | k-w | W | k-w |
X-1.Y | X, Y | X+1.Y | k | 0 | k |
X-1.Y+1 | X, Y+1 | X+1.Y+1 | w-k | w | w+k |
Из табл. 7.4, в частности, следует, что при перемещении по горизонтали адреса точек уменьшаются или увеличиваются на значение переменной bytppnt. Если для работы с кодами точек используются обычные операции, то после их выполнения текущий адрес надо изменить на bytppnt. Если же применяются строковые операции, то они автоматически изменяют текущий адрес на размер операнда. При обработке точек в естественном порядке, т. е. в сторону увеличения значений их координат, строковые операции увеличивают адрес, а при обработке точек в обратном порядке уменьшают его. Таким образом, при последовательной обработке точек строки для получения адреса очередной точки достаточно простой переадресации операндов.
Адрес следующей строки
Если строки графического объекта обрабатываются последовательно друг за другом, то после построения текущей строки надо определить адрес начала следующей (или предыдущей) строки. В этом случае простой переадресации операндов недостаточно.
Первые точки строк прямоугольной области расположены на экране в одном столбце. Значения координаты х у них совпадают, а координаты Y различаются на величину, кратную значению переменной bperline. Это и надо учесть при вычислениях.
Адрес начала текущей строки можно хранить в специально выделенном месте и для перехода к следующей строке увеличивать или уменьшать его значение на bperiine. Однако, как уже говорилось в разделе, неизвестно, какому окну принадлежит сохраненный адрес, поскольку при обработке строки могла произойти смена окна. Поэтому при таком способе вычислений будет нужен специальный признак переключения окна и анализ его состояния.
Для упрощения вычислений надо использовать адрес, полученный в конце обработки текущей строки. Он заведомо принадлежит установленному окну, а отличается от адреса начала строки на ширину прямоугольной области, выраженную в байтах. Поэтому если к нему прибавить значение переменной bperiine, уменьшенное на ширину прямоугольной области, то получится адрес начала следующей строки. Ширина прямоугольной области задается в виде количества точек, которое надо умножить на размер кода точки. Приведенные рассуждения можно записать в виде следующей формулы вычисления константы коррекции адреса (offsline обозначает смещение строки).
offsline = bperiine -widthrect*bytppnt = (horsize -widthrect)*bytppnt.
В этих формулах widthrect обозначает ширину прямоугольной области, выраженную в точках, имена остальных переменных вам известны. Оба варианта формулы равноценны по количеству выполняемых действий.
При работе в режимах PPG bytppnt=1 и формула превращается в разность (horsize – widthrect), которая и вычислялась в приведенных ранее примерах. В предыдущих разделах при описании подпрограмм построения и перемещения изображения курсора мы советовали в режимах direct color сдвигать указанную разность на 1 или 2 разряда влево. Такой прием прост, но не универсален. Универсальные способы вычисления значения offsline для режимов direct color описаны далее.
Мы обсудили два простых способа вычисления адресов при работе с графическими объектами, но ими не исчерпывается все разнообразие возможных вариантов. В общем случае при рисовании линий и геометрических фигур приращения адресов смежных точек не равны единице, они вычисляются по специальным алгоритмам. Поэтому основные действия при работе со сложными объектами сводятся к вычислению адресов точек, а собственно графика отступает на второй план.