Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Дополнительные процедуры и функции модуля 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, то – с верхом.

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

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

 

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

USES Graph;

VAR 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^);

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;

VAR x, 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: Пусть два снеговика идут друг другу навстречу.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал