Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование. Модуль GRAPH. Модульное и объектное программирование. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
841 Кб
Скачать

11

For x:=1 To 4 Do Drawpoly (6, ass); Readln; CloseGraph;

End.

Для задания точек излома можно использовать следующий определенный в модуле тип:

type

PointType=record x, y: word

end;

Пример: Построить на экране правую ветвь параболы, направленную вверх.

Program DemoDrawPoly: Uses

CRT, Graph;

Var

GrDriver, GrMode, x: Integer; ass: Array [1..100] of PointTupe;

Begin

GrDriver: =Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); For x:=1 To 100 Do

Begin

ass [x]. x:= 10*x;

ass [x]. y:= 450-2*x*x;

End; DrawPoly (100, ass); Readln; CloseGraph;

End.

Необходимо отметить, что на количество точек излома накладываются ограничения, связанные с размером используемой буферной памяти. Обычно для небольших программ количество точек излома лежит в пределах 600-670 точек.

1.5. Изображение дуг, окружностей, эллипсов

Процедура Circle

Вычерчивает окружность.

Заголовок: Procedure Circle (X, Y: integer, R: word);

Здесь, X и Y – координаты центра, R – радиус в пикселах.

12

Окружность выводится текущим цветом. Толщина линии, устанавливается текущим стилем, вид линии всегда SolidLn (сплошная). Процедура вычерчивает правильную окружность с учетом изменения линейного размера радиуса в зависимости от его направления относительно сторон графического экрана. В связи с этим параметр R определяет количество пиксел в горизонтальном направлении.

Процедура Arc

Вычерчивает дугу окружности.

Заголовок: Procedure Arc (X, Y: integer; Beg A, End A, R: word);

Здесь, X и Y – координаты центра; Beg A и End A – соответственно начальный и конечный углы дуги; R – радиус.

Углы отсчитываются против часовой стрелки и указываются в градусах. Нулевой угол соответствует горизонтальному направлению вектора слева направо. Если задать значения начального угла 0˚ и конечного – 359˚, то будет выведена полная окружность, при вычерчивании дуги окружности используются те же соглашения относительно линий и радиуса, что и в процедуре Circle.

 

 

 

 

 

 

 

 

 

 

0˚-90˚

 

 

270˚-450˚

 

 

 

 

 

 

 

 

 

 

 

Процедура Ellipse

Вычерчивает эллипсную дугу.

Заголовок: Procedure Ellipse (X, Y: integer: Beg A, End A, RX, RY: word);

Здесь, X и Y – координаты центра; Beg A, End A, – соответственно, начальный и конечный углы дуги; RX, RY – горизонтальный и вертикальный радиусы эллипса в пикселах.

При вычерчивании дуги эллипса используются те же соглашения относительно линий, что и в процедуре Circle, и те же соглашения относительно углов, что и процедуре Arc.

13

1.6. Краски, палитры, заполнения

Процедура SetColor

Устанавливает текущий цвет для выводимых линий и символов.

Заголовок: Procedure SetColor (Color: word);

Здесь, Color – текущий цвет.

В модуле Graph определены точно такие же константы для задания цвета, как и в модуле CRT.

Процедура SetBkColor

Устанавливает цвет фона.

Заголовок: Procedure SetBkColor (Color: word);

Здесь, Color – цвет фона.

В отличии от текстового режима, в котором цвет фона может быть только темного оттенка, в графическом режиме он может быть любым. Установка нового цвета фона немедленно изменяет цвет графического экрана. Это означает, что нельзя создать изображение, два участка которого имели бы разный цвет фона.

Процедура SetPalette

Заголовок: Procedure SetPalette (N: Word; Color: ShortInt);

Первоначальное размещение цветов в палитре EGA/VGA соответствует последовательности их описания константами Black, …, White, … и т.д., т.е. цвет с индексом 0 – черный, 1 – синий, 2 – зеленый, …. После обращения к процедуре все фрагменты изображения, выполненные цветом с индексом N из палитры цветов, получат цвет Color.

Например, если выполнить оператор

SetPalette (2, White);

то цвет с индексом 2 (первоначально это бирюзовый цвет Cyan), будет заменен на белый.

Что касается цвета с индексом 0, то он отождествляется с цветом фона и может изменяться наряду с любым другим цветом.

Пример: Разработать программу, которая выводит на экране ряд прямых разного цвета текущей цветовой палитры, затем изменяет случайным образом цветовую палитру и выводит ряд линий разного цвета новой цветовой палитры.

Program DemoSetPalette; Uses

CRT, Graph;

Var

GrDriver, GrMode, i: Integer; pal: Array [0..15] of Integer;

Begin

14

GrDriver: =Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI');

For i:=1 To 15 Do

Begin

SetColor(i);

Line (10, 10+10*i, 300, 10+10*i);

End;

Randomize;

For i:=0 To 15 Do

Pal [i]:= Random(16);

For i:=0 To 15 Do

SetPalette (i, Pal[i]);

Readln;

CloseGraph;

End.

Процедура SetAllPalette

Изменяет одновременно несколько цветов палитры.

Заголовок: Procedure SetAllPalette (var Palette);

Параметр Palette в заголовке процедуры описан как нетипизированный параметр. Первый байт этого параметра должен содержать длину N палитры, остальные n байты – номера вновь устанавливаемых цветов в диапазоне от 1 до MaxColors. Код «1» означает, что соответствующий цвет исходной палитры не меняется.

Рассмотрим реализацию предыдущей задачи с использованием процедуры SetAllPalette.

Program DemoSetPalette 2; Uses

CRT, Graph;

Var

GrDriver, GrMode, i: Integer; pal: Array [0..16] of Integer;

Begin

GrDriver: =Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); Randomize;

For i:=0 To 16 Do

Pal [i]:= Random(16); Pal [0]:= 15;

SetAllPalette (Pal); SetBkColor (1); For i:= 1 To 15 Do

Begin

15

SetColor(i);

Line (10, 10+10*i, 300, 10+10*i);

End;

Readln;

CloseGraph;

End.

Особенностью использования процедуры SetAllPalette в таких конструкциях является то, что 0-цвет (по умолчанию) – цвет фона как бы выпадает из поля зрения. В программе используется строка SetBkColor (1) для лучшей демонстрации, поскольку по умолчанию цвет фона всегда 0 (черный) и линии с темными оттенками становятся невидимыми. В модуле Graph определена константа

const

MaxColors= 15;

и тип

Type

PalettePupe=Record

Size: Word; {количество цветов в палитре} {номера входящих в палитру цветов}.

Colors: Array [0..MaxColors] of ShortInt;

End;

С помощью следующей программы можно вывести на экран номера всех возможных цветов из текущей палитры.

Program DemoSetPalette ; Uses

CRT, Graph;

Var

GrDriver, GrMode, i: Integer; pal: PaletteTupe;

Begin

GrDriver: =Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); GetDefaultPalette (Pal);

GetPalette (Pal); CloseGraph;

For i:= 1 To 16 Do

Writeln (pal.colors[i]);

End.

В этой программе процедура SetPalette возвращает размер и цвета текущей палитры.

Ее заголовок: Procedure GetPalette (var PaletteInfo: PaletteTupe);

16

Процедура GetDefaultPalette

Возвращает структуру палитры, устанавливаемую по умолчанию (в режиме автонастройки).

Заголовок: Procedure GetDefaultPalette (var Palette:PaletteTupe);

Здесь, Palette переменная типа PaletteTupe, в которой возвращаются размер и цвета палитры.

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

Program demoSetPalette; Uses

CRT, Graph;

Var

GrDriver, GrMode, i: Integer; Pal: PaletteTupe;

Begin

GrDriver: =Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); Randomize;

For i:=0 To 16 Do

Pal.colors[i]:= Random(16); Pal.colors[0]:= 15;

SetAllPalette (Pal.colors); For i:= 0 To 15 Do

Begin

SetColor(i);

Line (10, 10+10*i, 300, 10+10*i);

End;

Readln; GetDefaultPalette (Pal); Pal.colors[0]:= 15; SetAllPalette (Pal.colors); For i:= 0 To 16 Do

Begin

SetColor(i);

Line (10, 10+10*i, 300, 10+10*i);

End;

Readln;

CloseGraph;

End.

17

Процедура SetFillStyle

Устанавливает стиль (тип и цвет) заполнения.

Заголовок: Procedure SetFillStyle (Fill, Color: Word);

Здесь, Fill –тип заполнения; Color –цвет заполнения.

С помощью заполнения можно покрывать какие-либо фрагменты изображения периодически повторяющимся узором. Для указания типа заполнения используются следующие предварительно определенные

константы:

 

 

 

const

 

 

 

EmptyFill= 0; {заполнение фоном (узор отсутствует)}

 

SolidFill= 1; {сплошное заполнение}

 

 

 

LineFill= 2; {заполнение

}

 

 

LtSlashFill= 3; {заполнение

 

}

 

FillSlash= 4; {заполнение утолщенными

}

 

BkSlashFill= 5; {заполнение утолщенными

}

LtBkSlashFill= 6; {заполнение

 

}

 

HatchFill= 7; {заполнение + + + + + + +}

 

XHatchFill= 8; {заполнение

 

}

 

InterleaveFill= 9; {заполнение

 

}

 

WodeDotFill= 10; {заполнение

 

}

 

CloseDotFill= 11; {заполнение

 

}

 

UserFill= 12; {заполнение

 

}

 

Процедура SetFillPattern

Устанавливает образец рисунка и цвет штриховки.

Заголовок: Procedure SetFillPattern (Pattern: FillPattern Type;Color: Word);

Здесь, Pattern –выражение типа FillPatternType, устанавливает образец рисунка для Fill=UserFill в процедуре SetFillStyle; Color –цвет заполнения.

Образец рисунка задается в виде матрицы из 8х8 пиксел и может быть представлен массивом из 8 байт следующего типа:

Type

FillPattern= Array[1..8] of Byte;

Каждый разряд любого из этих байтов управляет светимостью пиксела, причем первый байт определяет 8 пиксел первой строки на экране, второй байт –8 пиксел второй строки и т.д.

Пример: Рассмотрим порядок установки образца рисунка. На рисунке черточкой обозначается несветящийся пиксел (0 в двоичной системе), а прямоугольником – светящийся (1 в двоичной системе).

 

18

 

Образец

В двоичной системе

Значение

 

 

байта

– # – – # – – #

0 1 0 0 1 0 0 1

$49

# – – # – – # –

1 0 0 1 0 0 1 0

$92

– # – – # – – #

0 1 0 0 1 0 0 1

$49

# – – # – – # –

1 0 0 1 0 0 1 0

$92

– # – – # – – #

0 1 0 0 1 0 0 1

$49

# – – # – – # –

1 0 0 1 0 0 1 0

$92

– # – – # – – #

0 1 0 0 1 0 0 1

$49

# – – # – – # –

1 0 0 1 0 0 1 0

$92

Uses

CRT, Graph;

Const

pat: FillPatternType= ($49, $92, $49, $92, $49, $92, $49, $92);

Var

GrDriver, GrMode, i: Integer;

Begin

GrDriver: =Detect;

InitGraph (GrDriver, GrMode, 'C: |Bp| BGI'); SetBkColor (Blue);

SetFillStyle (UserFill, White); SetColor (Red); SetFillPattern (Pat1, White); Bar (10, 10, 100, 100); Readln;

CloseGraph;

End.

Результатом выполнения данной программы является прямоугольник в верхнем левом углу, закрашенный белым цветом с полосками синего цвета в форме малого зигзага (согласно образцу).

Программа демонстрирует, что цвет полос определяется исключительно цветом фона (SetBkColor), а процедура SetColor никоим образом не оказывает влияние на процедуру Bar.

Процедура FloodFill

Заполняет произвольную замкнутую фигуру, используя текущий стиль заполнения (узор и цвет).

Заголовок: Procedure FloodFill (X, Y: Integer; Border: Word);

19

Здесь, X и Y –координаты любой точки внутри замкнутой фигуры; Border – цвет граничной линии.

Если фигура незамкнута, заполнение «разольется» по всему экрану.

Процедура FloodFill отличается некоторым несовершенством. Она часто дает сбой при закрашивании небольших фигур. В фирменном руководстве по Турбо Паскаль рекомендуется, по возможности, вместо процедуры FloodFill использовать процедуру FillPoly (заполнение прямоугольника).

Пример: Разработать программу построения двух окружностей и заполнения одной из них волнистыми вертикальными линиями, а другой - маленькими кружками.

Образец рисунка волнистых линий выполняется аналогично предыдущей задаче. Образец построения окружностей:

$00

#

#

$18

#

#

$24

#

#

$42

#

#

$42

#

#

$24

#

#

$18

$00

Program MyOwn;

Uses

CRT, Graph;

Const

Pat1: FillPatternType= ($49, $92, $49, $92, $49, $92, $49, $92);

Pat2: FillPatternType= ($00, $18, $24, $42, $42, $24, $18, $00);

Var

GrDriver, GrMode: Integer;

Begin

GrDriver:= Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI');

SetFillStyle (UserFill, Red);

SetFillPattern (Pat1, Blue);

Circle (150, 150, 50);

FloodFill (149, 149, Green);

SetFillPattern (Pat2, Red);

20

Circle (300, 300, 100); FloodFill (300, 300, Green); Readln;

CloseGraph;

End.

Программа отличается неустойчивостью работы. На разных машинах получается разный результат. Чаще всего происходит закрашивание всего экрана сначала волнистыми линиями, затем малыми кругами.

Процедура Bar

Заполняет прямоугольную область экрана.

Заголовок: Procedure Bar (X1, Y1, X2, Y2: Integer);

Здесь, X1 и Y1 –координаты левого верхнего угла закрашиваемой области; X2 и Y2 –координаты правого нижнего угла закрашиваемой области.

Процедура закрашивает, но не обводит прямоугольник текущим образцом узора и текущим цветом, которые устанавливает процедура

SetFillStyle.

Следующая программа закрашивает два прямоугольника волнистыми линиями и кружками.

Program MyOwn; Uses

CRT, Graph;

Const

Pat1: FillPatternType= ($49, $92, $49, $92, $49, $92, $49, $92); Pat2: FillPatternType= ($00, $18, $24, $42, $42, $24, $18, $00);

Var

GrDriver, GrMode: Integer;

Begin

GrDriver:= Detect;

InitGraph (GrDriver, GrMode, 'C: \Bp\BGI'); SetFillStyle (UserFill, Red);

SetFillPattern (Pat1, Blue); Bar (10, 50, 150, 250); SetFillPattern (Pat2, Red); Bar (250, 50, 450, 250); Readln;

CloseGraph;

End.

Процедура Bar3d (X1, Y1, X2, Y2, Depth: integer, Top:Boolean);

Здесь, X1 и Y1 –координаты левого верхнего угла передней грани, X2 и Y2 –координаты правого нижнего угла передней грани параллелепипеда. Если параметр Top имеет значение True, то верхняя грань параллелепипеда

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]