Программирование. Модуль GRAPH. Модульное и объектное программирование. Учебно-методическое пособие
.pdf11
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, то верхняя грань параллелепипеда
