19.3.1. Координаты устройства и мировые координаты
В растровой компьютерной графике экран представляет собой прямоугольный массив адресуемых точек и любое изображение на нем образуется как композиция светящихся или погашенных пикселов (так называется минимальный элемент изображения). Эти точки адресуются двумя целыми — горизонтальным номером точки nx и вертикальным номером ny:
0 <= nx <= nx_max,
0 <= ny <= ny_max,
где nx_max и ny_max — количество адресуемых точек по горизонтали и по вертикали минус единица. В табл. 19.4 в колонке «Разрешение экрана» показано количество точек для различных режимов и типов адаптеров дисплеев.
В модуле Graph предусмотрена возможность программного опроса максимальных адресуемых координат экрана. Она реализована парой функций
GetMaxX : Integer;
GetMaxY : Integer.
Возвращаемые ими значения соответствуют параметрам nx_max и ny_max в наших обозначениях и будут различаться для различных режимов и адаптеров. При адресации точек координатами, большими чем эти значения, операция игнорируется.
Точка с адресом (0,0) обычно расположена в левом верхнем углу экрана дисплея. Координаты (nx, ny) называют также координатами устройства. Они могут принимать только целые значения.
В компьютерной графике используются еще две системы координат. Первая — физическая система координат (px, py), где px — физическое расстояние на экране по горизонтали, а py — по вертикали. Ее оси измеряются в дюймах или миллиметрах.
Вторая система координат — так называемая мировая. Она представляет собой декартову систему (X, Y), определенную программистом, и является независимой от типа устройства отображения:
xmin < x < xmax
ymin < у < ymax
Параметры, которыми задаются диапазоны изменения x и y (xmin, xmax, ymin, ymax), определяют прямоугольную область в
- 422 -
абстрактном математическом двумерном пространстве. В примере на рис. 19.9 приведены необходимые объявления и процедура установки мировых координат.
| TYPE { глобальный тип }
| World_Rec = RECORD { запись: }
| xmin.ymin, { предельные значения }
| xmax.ymax, { мировых координат }
| width,height: Real { диапазон мира }
| END;
| VAR
| my_world :World_Rec; { глобальная переменная-мир }
| nx_max,ny_max: Integer; { макс. разрешение экрана }
| PROCEDURE SetWindowWorld(minX,minY,maxX,maxY : Real);
| BEGIN
| with my_world do begin { работа с записью my_world }
| xmin = minX; { Назначение мировых координат в }
| ymin = minY; { соответствии с заданными }
| xmax = maxX; { фактическими параметрами... }
| ymax = maxY;
| width := maxX - minX; { Определение диапазона их }
| height:= maxY – minY { возможного изменения }
| end {with}
| END;
Рис. 19.9
Для перевода текущих координат точки из мировой системы в систему устройства можно воспользоваться процедурой с рис. 19.10.
| PROCEDURE WorldToDevice(x, y : Real; VAR nx, ny : Integer);
| BEGIN
| with my_world do {работа с записью my_world }
| begin
| nx := Round((x-xmin)/width)*nx_max;
| ny := Round((y-ymin)/height)*ny_max
| end
| END;
Рис. 19.10
- 423 -
Заметим, что переменные nx_max, ny_max должны быть инициализированы сразу после включения соответствующего графического режима. Это можно сделать, используя функции GetMaxX и GetMaxY. Так как в модуле Graph все процедуры и функции работают с координатами устройства, то в дальнейшем все действия будут осуществляться только в определенной режимом системе координат.