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

<p>19.3.2. Управление «текущим указателем»</p>

«Текущий указатель» или, как его еще называют, графический курсор выполняет те же функции, что и курсор в текстовом режиме, однако является при этом невидимым. В текстовом режиме курсор находится каждый раз непосредственно за последним выведенным символом и указывает место вывода следующего. Положение графического курсора указывает на начальные координаты изображения графического примитива, выводимого «от текущей позиции». В графическом режиме текущий указатель перемещается специальными процедурами. В частности, процедура

MoveTo( х, у : Integer )

перемещает его в точку экрана с координатами (x, y). Другая процедура —

MoveRel( dx, dy : Integer )

перемещает текущий указатель на dx пикселов по горизонтали и соответственно на dy по вертикали относительно последнего положения текущего указателя. Положительные значения dx и dy увеличивают его координаты, а отрицательные — уменьшают. Помните, что в системе координат дисплея ось Y направлена вниз, поэтому, если указатель надо перенести вверх, то приращение dy должно быть отрицательным.

Для определения текущего положения графического курсора используются функции

GetX : Integer;

GetY : Integer,

возвращающие положение указателя соответственно по оси X и по оси Y. Позиционирование текущего указателя и опрос его местонахождения работают корректно, даже если работа происходит за пределами координат устройства.

Не все графические процедуры перемещают текущий указатель. Кроме названных выше, изменяют его положение лишь процедуры LineTo, LineRel, OutText. Все процедуры инициализации и очистки экрана (InitGraph, GraphDefaults, ClearDevice, SetGraphMode, SetViewPort и ClearViewPort) устанавливают его в положение (0,0).

- 424 -

<p>19.4. Рисование графических примитивов и фигур</p><p>19.4.1. Линии и их стили</p>

Процедура вывода линии (отрезка) на экран (в текущем цвете и стиле) определена в следующем виде:

Line( Х1, Y1, Х2, Y2 : Integer )

Здесь задаются координаты начала (X1,Y1) и конца (X2,Y2) отрезка. Возможны еще два метода рисования отрезков:

1. Из текущей точки в точку с заданными координатами (X,Y) процедурой

LineTo( х, у : Integer );

2. Относительно текущей позиции. Положение текущего указателя принимается за начало «временных» координат (0,0) и указывается местоположение конца отрезка в них. Такое построение делает процедура

LineRel( dx, dy : Integer )

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

В Турбо Паскале можно управлять стилем линий: задавать толщину, тип (сплошные линии, пунктирные и т.п.). Для этого определены следующие типы и константы стилей изображаемых линий:

TYPE

LineSettingsType = RECORD

LineStyle : Word; { стиль (тип) }

Pattern : Word; { шаблон типа }

Thickness : Word; { толщина }

END;

CONST

{ Для значений поля LineStyle: }

SolidLn = 0 { сплошная линия }

DottedLn = 1 { точечная линия }

CenterLn = 2 { штрихпунктирная линия }

DashedLn = 3 { пунктирная линия }

UserBitLn = 4 { тип линии задан явно шаблоном }

{ Для значений поля Thickness: }

NormWidth = 1 { толщина линии в один пиксел }

ThickWidth = 3 { толщина линии в три пиксела }

- 425 -

Чтобы получить информацию о текущем стиле линий, можно воспользоваться процедурой

GetlineSettings( VAR LineType : LineSettingsType )

а чтобы установить новый стиль линий, необходимо использовать процедуру

SetLineStyle( LineStyle, Pattern, Thickness : Word ),

подставив в нее соответствующие значения. Если параметр LineStyle не равен UserBitLn, то значение параметра Pattern не играет роли и обычно задается нулем.

Рассмотрим подробно вариант, когда LineStyle равно UserBitLn. В этом случае при определении типа линии руководствуются следующими соображениями:

1. Линия представляет собой совокупность отрезков, каждый из которых имеет длину 16 пикселов. Если длина линии не делится на 16 нацело, то последний отрезок обрезается.

Перейти на страницу:

Поиск

Похожие книги