
Технологии обработки информации(лекции) / Модули_лаб.работы
.pdf31
задающего шаблон. Для задания тонкой линии по данному шаблону необходимо установить
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