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 все процедуры и функции работают с координатами устройства, то в дальнейшем все действия будут осуществляться только в определенной режимом системе координат.