Скачиваний:
308
Добавлен:
01.05.2014
Размер:
3.67 Mб
Скачать
      1. Дополнительные процедуры и функции модуля Graph

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

Функция

Смысл

GetMaxX :Integer

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

GetMaxY :Integer

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

GetPixel(x,y :Integer) :Word

Выдает номер цвета пиксела с координатами xиy.

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

Процедура

Смысл

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример 1.Нарисуем в левом верхнем углу экрана четыре окружности, а затем скопируем получившиеся «очки» в правый нижний угол.

USESGraph;

VARGd, Gm : Integer;

P : pointer;

Size : Word;

begin

Gd := 0; InitGraph(Gd, Gm, 'с:\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^);

ReadLn;

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

ReadLn;

CloseGraph

end.

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

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

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

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

USES Graph,crt;

VARx,Gd, Gm : Integer;

P : pointer;

Size : Word;

begin

Gd := 0; InitGraph(Gd, Gm, 'с:\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, P^,1);

Delay(40);

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

x:=x+1;

end{while};

CloseGraph

end.

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

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