Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

15.4. Дополнительные процедуры и функции модуля Graph

Кроме процедур, которые заставляют Паскаль что-либо сделать, в модуле Graph имеются функции, которые могут сообщать программисту ту или иную информацию. Вот некоторые из них:

Функция

Смысл

GetMaxX integer

Выдает максимально возможную горизонтальную координату экрана

GetMaxY :Integer

Выдает максимально возможную вертикальную координату экрана

GetPixel(x,y :Integer) :Word

Выдает номер цвета пиксела с координатами х и у

А вот еще процедуры рисования:

Процедура

Смысл

Arc (x,y :Integer; fi1 ,fi2,r Word)

Рисует дугу окружности с центром в точке (х,у) и радиусом r. Дуга начинается от угла fi1 градусов и кончается углом fi2 градусов

PieSlice (x,y :Integer; fi1,fi2.r :Word)

Закрашенный сектор круга. Дуга сектора определяется так же, как в процедуре Arc. Цвет и стиль заливки определяются процедурой SetFillStyle

FillEllipse (x,y :Integer; rx,ry :Word)

Закрашенный эллипс с центром в точке (х,у) и радиусами rx, ry. Цвет и стиль заливки определяются процедурой SetFillStyle

Sector (x,y :Integer; fi1,fi2,rx,ry :Word)

Закрашенный сектор эллипса. Опирается на дугу эллипса с центром в точке (х,у) и радиусами rx, ry. Дуга начинается от угла fi1 градусов и кончается углом fi2 градусов

Bar(x1,y1.x2,y2 :Integer)

Закрашенный прямоугольник с противоположными углами в точках (x1, y1) и (х2, у2)

Bar3D (x1,y1, x2,y2 :Integer; tol Word; top.Boolean)

Трехмерный параллелепипед, обращенный к нам прямоугольной гранью с противоположными углами в точках (x1,y1) и (х2,у2). Толщина параллелепипеда - tol. Если top равно TopOff, то параллелепипед без верха, если top равно ТорOn, то - с верхом

15.5 Копирование и движение областей экрана

До сих пор мы заставляли двигаться лишь простые объекты: окружности, квадраты, линии. Если же мы хотим заставить двигаться что-нибудь посложнее, например снеговика из раздела 9.3, то нам придется изрядно потрудиться. Чтобы не рисовать и не стирать поочередно все элементы, из которых состоит снеговик, мы можем использовать процедуры Getlmage и Putlrnage, которые позволяют копировать любую прямоугольную область экрана целиком в другое место экрана.

Пример 1. Изобразим в левом верхнем углу экрана 4 окружности, а затем скопируем их в правый нижний угол.

USES Graph;

VAR Gd,Gm :Integer;

P :pointer;

Size : Word;

BEGIN

Gd:=0; InitGraph(Gd, Gm, 'c:\tp\bgi');

SetLineStyle(0,0,ThickWidth);

{Рисуем очки.}

Circle(50,100,20); Circle(50,100,15);

Circle(90,100,20); Circle(90,100,15);

{B целях наглядности нарисуем также диагональ экрана:}

Line(0,0,640,480);

Size:=ImageSize(10,60,120,140);

GetMem(P, Size);

GetImage(10,60,120,140,Р^);

ReadLn;

PutImage(500,400, Р^,0);

ReadLn;

CloseGraph

END.

Пояснения. Чтобы скопировать область экрана, Паскаль должен сначала ее запомнить в оперативной памяти. Выберем мысленно прямоугольник, охватывающий объект, предназначенный для копирования. В нашем случае подойдет прямоугольник между точками (10, 60) и (120, 140). Чтобы знать, сколько памяти отвести под запоминание области, компьютер должен знать размер изображения в байтах. Этот размер сообщает функция ImageSize. Поскольку размер этот может оказаться большим, запоминать изображение лучше всего в куче. Отводит место в куче процедура GetMem. Вот ее вызов: GetMem(P, Size), где Р - так называемый указатель на место в памяти, предназначенное для запоминания. Указатели - это новый для нас тип данных. Останавливаться на них не будем, скажем только, что они очень похожи на ссылки. Запоминает область процедура Getlmage, параметр которой Р^ имеет значением изображение этой области. Процедура Putlmage помещает это изображение в точно такой же прямоугольник экрана с верхним левым углом в точке (500, 400).

Если вы уже запустили эту программу, то могли видеть, что Getlmage прихватил в выделенном прямоугольнике и кусок диагонали, a PutImage добросовестно поместил на экран все, что прихватил GetImage, удалив все, что там было раньше. Ответственность за это несет последний параметр PutImage, равный у нас нулю. Для того, чтобы новое изображение не затирало старое, нужно использовать вместо нуля двойку.

Задание 130

Нарисуйте шеренгу из десятка снеговиков.

Пример 2. Попробуем двигать наши очки слева направо.

USES Graph,CRT;

VAR x,Gd,Gm :Integer;

P :pointer;

Size :Word;

BEGIN

Gd:=0; InitGraph(Gd, Gm, 'c:\tp\bgi');

SetLineStyle(0,0,ThickWidth);

{Рисуем очки:}

Circle(50,100,20); Circle(50,100,15);

Circle(90,100,20); Circle(90,100,15);

{Рисуем диагональ:}

Line(0,0,640,480);

Size := ImageSize(10,60,120,140);

GetMem(P, Size);

GetImage(10,60,120,140,P^);

{Начинаем движение:}

x:=20;

while x<300 do begin

PutImage(x, 150, Р^,1);

Delay(40);

PutImage(x,150,P^,1);

x:=x+1;

end{while};

CloseGraph

END.

Пояснение. Чтобы нарисовать очки в каком-то месте, а потом их стереть, достаточно два раза подряд употребить оператор PutImage(x, 150, Р^,1). Обратите внимание, что изображение прямой, по которому прошлись очки, не затерлось. Все это результат действия константы 1. Чтобы понять механизм ее действия, нужно знать азы алгебры логики.

Задание 131

Пусть два снеговика идут друг другу навстречу.