Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
65
Добавлен:
18.05.2015
Размер:
452.43 Кб
Скачать

31

задающего шаблон. Для задания тонкой линии по данному шаблону необходимо установить

SetLineStyle(4,$F0F0,1) или SetLineStyle(UserBitln,$F0F0,NormWidln)

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

Для получения информации о текущем стиле линий используется процедура GetLineSetting(T_Line), где T_line - переменная типа LineSettingsType, запись поля которой задают тип, шаблон и толщину линий.

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

Uses crt,graph;

Var xmax,ymax,xc,yc:word;

{Здесь должна располагаться процедура инициализации графического режима} Procedure ris;

var xc,yc,i,t:word; x1,x2,y1,y2,x,y:integer;

begin

randomize; { Обеспечение новой случайной последовательности при каждом новом запуске программы на выполнение}

xmax:=getmaxx; ymax:=getmaxy;

xc:=xmax div 2; yc:=ymax div 2; {Определение координат центра экрана} for i:=1 to 200 do begin

x:=random(xc); y:=random(ymax); {Определение случайных координат точек} putpixel(x,y,random(15));

end;

for i:=1 to 100 do begin

t:=random(3); {Назначение толщины линий} if t=2 then t:=1;

setlinestyle(random(3),0,t); {Назначения стиля линий} setcolor(random(getmaxcolor));{Назначение случайного цвета}

{Определение координат концов отрезков линий} x1:=xc+random(xc);

x2:=xc+random(xc);

y1:=random(ymax);

y2:=random(ymax);

line(x1,y1,x2,y2); {рисование линии } end;

readkey;

end; begin

Init_graph_Mode; Ris;

Closegraph;

end.

31

32

2.2.5 Рисование окружностей эллипсов и дуг

Рисование окружности заданного радиуса R с центром, координаты которого задаются переменными X и Y:

Circle(X,Y,R); X, Y - переменные типа Integer, а R - типа Word.

Координаты должны выбираться из диапазона: 0 X GetMaxX;

0 Y GetMaxY.

Рисование эллипса:

Ellipse(X, Y, A1, A2 RX, RY);

X , Y - координаты центра, переменные типа Integer;

A1, A2 - начальный и конечный углы эллипса в градусах (от 0 до 360); RX, RY - размеры горизонтальной и вертикальной полуосей эллипса; A1, A2, RX, RY - переменные типа Word.

Для изображения полного эллипса А1 = 0, А2=360. Кроме того, для изображения дуг используется процедура:

ARC(X, Y, A1, A2, R); Первые четыре параметра как при рисовании эллипса, а R - радиус дуги, переменная типа Word.

Процедура GetArcCoords (Coords) позволяет определить координаты центра, начала и конца дуги. Здесь Coords - переменная типа ArcCoordsType, в которой после обращения к данной процедуре содержатся эти координаты.

Тип ArcCoordsType определен в модуле Graph: Type

ArcCoordType = record

X, Y : integer; { Координаты центра}

Xstart, Ystart : integer; { Координаты начала дуги} Xend, Yend : integer; { Координаты конца дуги}

End;

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

2.2.6Рисование прямоугольников, многоугольников

иломаных линий

Для рисования прямоугольников используется процедура

Rectangle(X1, Y1, X2, Y2);

X1, Y1, X2, Y2 - координаты верхнего левого и нижнего правого углов прямоугольника, переменные типа Integer.

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

DrawPoly(K, KoorXY);

Если необходимо нарисовать многоугольник на N вершин или замкнутую ломаную линию, то необходимо задать параметр К = N+1 и задать координаты

32

33

(N+1) точек, причем координаты последней точки должны совпадать с координатами первой точки.

При рисовании произвольной ломаной незамкнутой линии, задается N точек и столько же пар координат.

KoorXY имеет предопределенный в модуле Graph тип PointType: Type

PointType = Record

X, Y: Integer; { координаты точки} End;

Обычно набор точек реализуется как массив из записей PointType. Этот массив должен быть заполнен данными до его использования в процедуре рисования фигуры.

Например, для рисования пятиугольника можно задать массив на 6 точек (записей) в виде типизированной константы:

Type

T_Mas = Array [1..6] of PointType;

Const

Mas_Koord : T_Mas = ((x=50;y=50),(x=200;y=50),(x=400;y=200), (x=250;y=350),(x=150;y=200),(x=50;y=50));

Begin

{Инициализация графического режима} DrawPoly (6, Mas_Koord);

. . .

End.

Следующая программа демонстрирует процесс рисования различных фигур.

Uses graph;

Procedure Init_Graph_Mode;

См. предыдущие программы procedure kontur;

var dx,dy,dr:integer; color,i:word;

begin

color:=6; setcolor(color); dx:=0; dy:=0;

{ Рисование прямоугольников} for i:=1 to 5 do begin color:=color-1;

dx:=dx+15; dy:=dy+10; rectangle(100-dx,100-dy,150+dx,160+dy); setcolor(color);

end; readkey;

{ Рисование окружностей} color:=6; setcolor(color); dr:=0;

33

34

for i:=1 to 5 do begin color:=color-1; dr:=dr+10; circle(450,130,30+dr); setcolor(color);

end;

readkey;

{Рисование эллипсов} color:=15; setcolor(color); dx:=0; dy:=0;

for i:=1 to 5 do begin color:=color-1; dx:=dx+15; dy:=dy+10;

ellipse(120,330,0,360,30+dx,20+dy);

setcolor(color);

end;

readkey;

{Рисование дуг}

color:=15; setcolor(color); dr:=0;

for i:=1 to 5 do begin color:=color-1; dr:=dr+15; arc(420,350,0,120,20+dr); setcolor(color);

end;

readkey;

end; begin

{Основная программа} Init_Graph_Mode; kontur;

closegraph;

end.

Лабораторная работа № 3.3 (17)

Разработка программ с использованием процедур и функций модуля

Graph (часть 1)

Цель работы:

1.Изучение процедур и функций модуля Graph.

2.Разработка программ с использованием модуля Graph.

34

35

Варианты заданий

 

Вариант 1

 

1.Инициализацию графического режима организовать в виде

отдельной

процедуры с анализом GraphResult.

 

2.Определить размеры и центр экрана в графическом режиме.

3.Переместить курсор в точку с координатами (180,180) с помощью процедуры MoveTo и затем в точку (310,180) процедурой MoveRel.

4.Нарисовать в нижней, левой четверти экрана 150 точек, выбирая координаты и цвета случайным образом.

5.Очистить экран.

6.Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры.

7.Определить положение графического курсора.

8.Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим.

9.Разделить экран на четыре равные части.

10.В верхней, левой четверти нарисовать три окружности, имеющие общий центр и радиусы 24, 28, 32. Линии окружностей должны быть разного цвета.

11.В правой верхней и левой нижней четвертях аналогично п.10

нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно).

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

13.Очистить экран.

14.Нарисовать несколько многоугольников, линии контуров которых должны иметь различный цвет.

15.Закрыть графический режим.

Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра.

Вариант 2

1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult.

2.Определить размеры и центр экрана в графическом режиме.

3.Переместить курсор в точку с координатами (50,150) с помощью процедуры MoveTo и затем в точку (350,200) процедурой MoveRel.

4.Нарисовать в верхней левой четверти экрана 200 точек, выбирая координаты и цвета случайным образом.

5.Очистить экран.

6.Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры рисования линий.

7.Определить положение графического курсора.

8.Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим.

35

36

9.Разделить экран на четыре части: провести диагонали через центр экрана.

10.В верхней четверти нарисовать три окружности, имеющие общий центр и радиусы 25, 30, 35. Линии окружностей должны быть разного цвета.

11.В левой и нижней четверти, аналогично п.10, нарисовать эллипсы и дуги

(радиусы и углы выбрать самостоятельно).

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

13.Очистить экран.

14.Нарисовать 5 треугольников, линии контуров которых должны иметь различный цвет.

15.Закрыть графический режим.

Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра.

Вариант 3 1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult.

2.Определить размеры и центр экрана в графическом режиме.

3.Переместить курсор в точку с координатами (80,180) с помощью процедуры MoveTo и затем в точку (210,180) процедурой MoveRel.

4.Нарисовать в нижней, правой четверти экрана 100 точек, выбирая координаты и цвета случайным образом.

5.Очистить экран.

6.Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры.

7.Определить положение графического курсора.

8.Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим.

9.Разделить экран на четыре равные части.

10.В верхней, левой четверти нарисовать три окружности, имеющие общий центр и радиусы 14, 26, 36. Линии окружностей должны быть разного цвета.

11.В правой верхней и левой нижней четвертях аналогично п.10

нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно).

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

13.Очистить экран.

14.Нарисовать 3 пятиугольника, линии контуров которых должны иметь различный цвет.

15.Закрыть графический режим.

Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра.

Вариант 4

36

37

1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult.

2.Определить размеры и центр экрана в графическом режиме.

3.Переместить курсор в точку с координатами (500,150) с помощью процедуры MoveTo и затем в точку (500,200) процедурой MoveRel.

4.Нарисовать в верхней левой четверти экрана 200 точек, выбирая координаты и цвета случайным образом.

5.Очистить экран.

6.Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры рисования линий.

7.Определить положение графического курсора.

8.Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим.

9.Разделить экран на четыре части: провести диагонали через центр экрана.

10.В верхней четверти нарисовать три окружности, имеющие общий центр и радиусы 26, 32, 38. Линии окружностей должны быть разного цвета.

11.В левой и нижней четверти, аналогично п.10, нарисовать эллипсы и дуги

(радиусы и углы выбрать самостоятельно).

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

13.Очистить экран.

14.Нарисовать два шестиугольника, линии контуров которых

должны иметь различный цвет. 15. Закрыть графический режим.

Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра.

Вариант 5 1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult.

2.Определить размеры и центр экрана в графическом режиме.

3.Переместить курсор в точку с координатами (380,380) с помощью процедуры MoveTo и затем в точку (310,380) процедурой MoveRel.

4.Нарисовать в нижней, левой четверти экрана 120 точек, выбирая координаты и цвета случайным образом.

5.Очистить экран.

6.Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры.

7.Определить положение графического курсора.

8.Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим.

9.Разделить экран на четыре равные части.

10.В верхней, левой четверти нарисовать три окружности, имеющие общий центр и радиусы 34, 38, 42. Линии окружностей должны быть разного цвета.

37

38

11.В правой верхней и левой нижней четвертях аналогично п.10 нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно).

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

13.Очистить экран.

14.Нарисовать треугольник и шестиугольник, линии контуров которых должны иметь различный цвет.

15.Закрыть графический режим.

Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра.

Вариант 6

1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult.

2.Определить размеры и центр экрана в графическом режиме.

3.Переместить курсор в точку с координатами (450,50) с помощью процедуры MoveTo и затем в точку (450,200) процедурой MoveRel.

4.Нарисовать в верхней, левой четверти экрана 160 точек, выбирая координаты и цвета случайным образом.

5.Очистить экран.

6.Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры рисования линий.

7.Определить положение графического курсора.

8.Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим.

9.Разделить экран на четыре части: провести диагонали через центр экрана.

10.В верхней четверти нарисовать три окружности, имеющие общий центр и радиусы 35, 40, 45. Линии окружностей должны быть разного цвета.

11.В левой и нижней четверти, аналогично п.10, нарисовать эллипсы и дуги

(радиусы и углы выбрать самостоятельно).

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

13.Очистить экран.

14.Нарисовать пяти и шестиугольник, линии контуров которых должны иметь различный цвет.

15.Закрыть графический режим.

Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра.

В модуле Graph предусмотрены процедуры рисования залитых фигур.

38

39

2.2.7 Задание типа заливки

Под заливкой понимается заполнение площади, нарисованной фигуры некоторым рисунком и цветом.

Для задания типа (шаблона) заливки используется процедура:

SetFillStyle (Pattern, Color);

Pattern - тип заливки, Color - цвет заливки (от 0 до 15), переменные типа Word. Значения переменной Pattern выбираются из констант, определенных в

модуле Graph:

 

Const

EmptyFill = 0 { Сплошная заливка цветом фона}

 

SolidFill = 1 { Сплошная заливка текущим (Color) цветом}

 

LineFill = 2 { Заливка типа = = = }

 

LtSlashFill = 3 { Заливка типа ///}

 

SlashFill = 4 { Заливка жирными линиями типа ///}

 

BkSlashFill = 5 { Заливка жирными линиями типа \\\}

 

LtBkSlashFill = 6 { Заливка типа \\\}

 

HatchFill = 7

{ Заливка редкой штриховкой }

 

XhatchFill = 8

{ Заливка частой штриховкой }

 

InterleaveFill = 9 {Заливка прерывистой линией}

 

WideDotFill = 10 {Заливка редкими точками}

 

CloseDotFill = 11 { Заливка частыми точками}

 

UserFill = 12

{ Заливка, определенная программистом}

Если вы хотите определить свой тип (новый, отличный от 1-11 типов), то необходимо воспользоваться сначала процедурой SetFillPattern(Matr,Color), где Matr - переменная типа FillPatternType, определенного в модуле Graph:

Type

FillPatternType = array[1..8] of byte;

Таким образом, Matr - это массив, его необходимо заполнить до использования, шестнадцатеричными значениями.

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

1

0

1

0

1

0

1

0

0

1

0

1

0

1

0

1

1

0

1

0

1

0

1

0

0

1

0

1

0

1

0

1

1

0

1

0

1

0

1

0

0

1

0

1

0

1

0

1

1

0

1

0

1

0

1

0

0

1

0

1

0

1

0

1

39

40

Каждое двоичное число, записанное в одной строке матрицы, переведем в шестнадцатеричное представление, а затем заполним этими значениями массив

Matr.

1 строка - 10101010 = $AA; 2 строка - 01010101 = $55. Все нечетные строки совпадают с первой, а четные со второй.

Далее задаем: Const

Matr: FillPatternType =($AA,$55, $AA,$55, $AA,$55, $AA,$55);

Представленный шаблон программисты называют заливка 50%. Для определения текущего шаблона заливки используется процедура:

GetFillSetting(FillType). Переменная FillType имеет тип FillSettingType,

определенный в модуле Graph. Type

FillSettingType = Record

Pattern:word; { тип заливки или шаблон} Color : word; { текущий цвет}

End;

2.2.8 Рисование залитых фигур

После задания типа заливки можно рисовать залитые фигуры.

FillEllipse (X, Y, Xrad, Yrad) - залитый эллипс. X, Y - координаты центра; Xrad, Yrad - радиусы полуосей.

FillPoly(K, KoordXY) - рисование залитого замкнутого многоугольника. Параметры те же, что в процедуре DrawPoly;

FloodFill(X, Y. CG) - заполнение любой замкнутой фигуры которой принадлежит точка с координатами (X, Y) и контур которой нарисован цветом CG. Заполнение производится в соответствии с установленным ранее типом заливки.

Pieslice(X, Y, A1, A2, Rad) - рисование залитого кругового сектора с центром (X, Y), радиуса Rad. A1, A2 - начальный и конечный углы сектора.

Sector(X, Y, A1, A2, Xrad, Yrad) - рисование залитого эллиптического сектора с центром (X, Y), радиусами полуосей Xrad, Yrad. A1, A2 - начальный и конечный углы сектора.

Bar (X1, Y1, X2, Y2) - залитый прямоугольник. X1, Y1, X2, Y2 - координаты верхнего левого и правого нижнего углов прямоугольника.

Bar3D (X1, Y1, X2, Y2, D, Top) - рисует параллелепипед, лицевая сторона которого заливается по текущему шаблону; D - глубина параллелепипеда.

Параметр Top задает режим отображения верхней плоскости параллелепипеда (True - отображать, False - не отображать).

В модуле Graph определены две константы для задания параметра Top: Const

TopOn = True;

TopOff = False.

40