Процедуры для работы с геометрическими объектами
Процедура PutPixel(x,y:integer;Pixel:word);
Высвечивание на экране точки с координатами (x, y) и цветом Pixel.
ПроцедураLineTo(x,y:integer);
Проведение прямой из точки с текущими координатами в точку (x, y) текущим цветом.
ПроцедураLineRel(dx,dy:integer);
Проведение прямой из точки с текущими координатами в точку с приращением координат от текущих на dx, dy текущим цветом. Текущими становятся координаты полученной точки.
ПроцедураLine ( x 1, y 1, x 2, y 2: integer );
Проведение прямой из точки (x1, y1) в точку (x2, y2) текущим цветом.
ПроцедураRectangle(x1,y1,x2,y2:integer);
Изображение прямоугольника с координатами диагонали (x1, y1) и (x2, y2).
ПроцедураCircle(x,y:integer;Radius:word);
Проведение окружности с центром в точке (x, y) и радиусом Radius.
ПроцедураArc(x,y:integer;AL1,AL2,Radius:word);
Создание дуги окружности с центром в точке (x, y) радиусом Radius, начальным углом AL1 и конечным углом AL2. Углы измеряются в градусах и от оси абсцисс против часовой стрелки.
ПроцедураEllipse(x,y:integer;AL1,AL2,XRad,YRad:word);
Изображение эллипса или дуги эллипса с центром в точке (x, y), с полуосями XRad, Yrad, начальным AL1 и конечным AL2 углами.
ПроцедураSetLineStyle(LineStule,Pattern,Thick:word);
Задание способа рисования линии.
LineStule – тип линии, может принимать значения:
0 – сплошная;
1 – точечная;
2 – прерывистая, штрихпунктирная;
3 – прерывистая, штриховая.
Pattern - параметр используется только при пользовательском типе линии (если LineStule = 4), во всех остальных случаях он игнорируется.
Thick - определяет толщину линий и может принимать два значения: 1 (нормальная) и 3 (утолщенная).
Процедуры задания цвета и заливки области
ПроцедураSetColor ( Color : word );
Установка цвета выводимого графического объекта. Параметр Color задает цвет рисунка в соответствии с описанной ранее таблицей 10.1 цветов (кроме мерцания).
ПроцедураSetBkColor ( Color : word );
Установка цвета фона.
ПроцедураSetFillStyle(Pattern:word;Color:word);
Подготовка (установка параметров) к заливке. Pattern – параметр, определяющий способ заливки, может принимать значения от 1 до 11.
Некоторые значения:
0 - заливка цветом фона;
1 - сплошная заливка;
2 - штриховка горизонтальными линиями;
3 - штриховка наклонными линиями;
10 – штриховка точками.
ПроцедураFloodFill(x,y:integer;Border:word);
Заливка замкнутой области. x, y – точка, из которой начинается заливка, Border – параметр, задающий цвет границы области, в которой производится заливка. Если внутри области закраски есть точки с цветом, отличным от Border, то они закрашиваются.
Процедуры работы с текстом
ПроцедураOutText ( TextString : string );
Вывод на экран строки, начиная с текущей позиции светового пера.
ПроцедураOutTextXY(x,y:integer;TextString:string);
Выдача на экран строки текста, начиная с точки, имеющей координаты x , y.
ПроцедураSetTextJustify(horiz,vert:word);
Горизонтальная и вертикальная привязка выводимого текста относительно текущего положения светового пера. Параметр horiz может принимать значения: 0 – левое выравнивание; 1 – центрирование; 2 – правое выравнивание. Параметр vert может принимать значения: 0 – нижнее выравнивание; 1 – центрирование; 2 – верхнее выравнивание.
Примеры использования модуля GRAPH
Задача 11.1. Нарисовать дом (рисунок 11.2).
В программе приняты следующие обозначения:
x n, y n - координаты левого нижнего угла дома;
l - ширина дома;
ras - расстояние от дома до дерева;
l 0, h 0 - ширина и высота окон;
2a - расстояние между окнами;
ld - ширина ствола дерева;
h 1, h 2 - высота первого этажа дома и крыши;
P - расстояние от пола до окна;
hd - высота ствола дерева;
h k - расстояние от земли до центра кроны;
![]() |
Рисунок 11.2 – Схема дома
Программа решения задачи показана на рисунке 11.3.
Program Example_21;
uses GRAPH;
Const xn=150; yn=300; l=120; ras=100; lo=40; a=10; ld=10;
ho=60; h1=100; h2=50; p=25; hd=67; hk=120; rdx=25; rdy=55;
var gd,gm,x,y,x1,y1,x2,y2 : integer;
begin
gd:=detect; { автовыбор адаптера }
initgraph(gd,gm,' '); { инициализация графического режима }
SetColor(6); { установка коричневого цвета }
Rectangle(xn,yn,xn+l,yn-h1); { рисование первого этажа }
x:=xn+l div 2 -a; y:=yn-p;
x1:=x-lo; y1:=y-ho;
Rectangle(x,y,x1,y1); { левое окно }
x2:=x-lo div 2; y2:=y-ho div 2;
line(x,y2,x2,y); { ромбик в левом окне }
line(x2,y,x1,y2);
line(x1,y2,x2,y1);
line(x2,y1,x,y2);
x:=x+2*a; x1:=x+lo;
Rectangle(x,y,x1,y1); { правое окно }
x2:=x+lo div 2;
line(x,y2,x2,y); { ромбик в правом окне }
line(x2,y,x1,y2);
line(x1,y2,x2,y1);
line(x2,y1,x,y2);
x:=xn+ l div 2; y:=yn-h1;
Ellipse(x,y,0,180,l div 2,h2); { крыша }
y:=y-h2 div 2;
Ellipse(x,y,0,360,15,20); { окно на чердаке }
Line(x-15,y,x+15,y); { рама в окне на чердаке }
Line(x,y-20,x,y+20);
x:=xn+l+ras; y:=yn;
Rectangle(x,y,x+ld,y-hd); { ствол дерева }
x1:=x+ld div 2; y1:=y-hk;
Ellipse(x1,y1,0,255,rdx,rdy); { крона дерева }
Ellipse(x1,y1,285,360,rdx,rdy);
SetFillStyle(10,2); { закраска кроны }
FloodFill(x1,y1,6);
SetFillStyle(1,6); { закраска ствола}
FloodFill(x1,y1+rdy,6);
Line(xn-20,yn,xn+l+ras+ld+20,yn); { основание - земля }
readln; { фиксация изображения }
CloseGraph { закрытие графического режима}
end.
Рисунок 11.3 – Программа Example_21
Задача 11.2. Построить спираль вокруг точки с координатами (x c, y c), число витков – 20, начальное направление спирали образует с осью абсцисс угол a.
Параметрическое уравнение спирали:
x = R × cos t
y = R × sin t
R = t
a £ t £ 2 p n
Идея построения кривой состоит в том, что вычисляются координаты двух близко расположенных точек, которые соединяются прямой линией, т.е. используется кусочно-линейная аппроксимация.
В качестве двух рядом расположенных точек выберем такие точки, для которых значение параметра t отличается на 1°.
Первоначально луч на экране устанавливаем в точку с координатами (x c, yc).
В программе, представленной на рисунке 11.4, приняты следующие обозначения:
x c, yc – координаты центра экрана;
n - количество витков спирали;
t - параметр уравнения, описывающего спираль;
R - радиус спирали;
x, y - координаты текущей точки.
При написании программы следует учитывать, что координаты экрана выражаются целыми величинами.
Program Example_22;
uses GRAPH;
Const xc=320; yc=200; n=20; { координаты центра и количество витков }
var gradus,t,r :real;
k,gd,gm,i,x,y : integer;
begin gradus:=pi/180; { 1 градус в радианах }
t:=pi/4; { начальный угол - 45 градусов }
gd:=detect; { автовыбор адаптера }
initgraph(gd,gm,' '); { инициализация графического режима }
MoveTo(xc,yc); { установка луча в центр экрана }
for i:=1 to n do begin { цикл по виткам спирали }
for k:=1 to 360 do begin { построение 1-го оборота спирали }
t:=t+gradus;
r:=t*1;
x:=round(r*cos(t))+xc;
y:=round(r*sin(t))+yc;
LineTo(x,y)
end
end;
readln; { фиксация изображения }
CloseGraph { закрытие графического режима}
end.
Рисунок 11.4 – Программа Example_22
МОДУЛИ
Модуль – это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, функции и процедуры) и, возможно, некоторые исполняемые операторы. Наличие модулей в ТУРБО ПАСКАЛЕ позволяет программировать и отлаживать программу по частям, создавать библиотеки подпрограмм и данных, воспользоваться возможностями стандартных модулей, практически неограниченно увеличивать кодовую (содержащую коды команд) часть программы.
Структура модуля показана на рисунке 12.1.
UNIT <имя_модуля>;
INTERFACE
<интерфейсная часть>;
IMPLEMENTATION
<исполняемая часть>;
BEGIN
<секция инициализации>
END.
Рисунок 12.1 – Структура модуля
Заголовок модуля состоит из служебного слова UNIT и следующего за ним имени модуля. Это имя должно совпадать с именем дискового файла, в который помещается исходный текст модуля, т.е. содержать не более восьми латинских букв и цифр и начинаться обязательно с буквы. Если, например, имеем заголовок модуля MyModule, то исходный текст должен размещаться в файле MyModule.pas.
Интерфейсная часть содержит объявления всех глобальных объектов (типов, констант, переменных и подпрограмм), которые должны стать доступными в основной программе, в данном модулеи/или в других модулях. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок, например:
Unit MyModule;
Interface
type Mas=array[1..20] of real;
var Ier:integer;
Procedure Sum(x:Mas; n:integer; Var S:real);
При такой интерфейсной части в основной программе, использующей модуль MyModule, и в самом модуле станут доступны тип Mas, переменная Ier и процедура Sum.
Исполняемая часть содержит описания подпрограмм, объявленных в интерфейсной части. В ней могут также объявляться локальные для модуля объекты – вспомогательные типы, константы, переменные.
Описанию подпрограммы, объявленной в интерфейсной части модуля, в исполняемой части должен предшествовать заголовок, как, например, это показано на рисунке 12.2.
Unit MyModule;
Interface
type Mas=array[1..20] of real;
var Ier : integer;
Procedure Sum(x :Mas; N :integer; Var S :real);
Implementation
Procedure Sum(x :Mas; N :integer; Var S :real);
Var i :integer;
Begin
S :=0;
For i :=1 to N do S :=S+X[i]
end;
end.
Рисунок 12.2 – Пример модуля
Секция инициализации завершает модуль. Она может отсутствовать вместе с начинающим её словом BEGIN или быть пустой – тогда за BEGIN сразу следует END.
В этой секции размещаются исполняемые операторы, содержащие некоторый фрагмент программы. Эти операторы исполняются до передачи управления основной программе и обычно используются для подготовки её работы. Например, в них могут инициироваться переменные, открываться нужные файлы и т.п.
Задача. Вычислить . Для вычисления интеграла использовать метод левых прямоугольников. Подпрограмму, реализующую метод, записать в модуль.
Для вычисления интеграла методом левых прямоугольников отрезок интегрирования делится на n равных частей длиной h и используется формула:
.
На рисунке 12.3 представлена программа Example_22, а на рисунке 12.4 текст модуля, к которому обращается программа.
Program Example_23;
uses Studious;
var n : integer;
s,a,b : real;
Function f1(x:real):real;
begin
f1:=sin(x)
end;
Function f2(x:real):real;
begin
f2:=x*x+1
end;
Begin
write('Введите N '); Read(n);
write('Введите A,B '); Read(a,b);
S:=Integral(a,b,n,f1)+Integral(a,b,n,f2);
write('S=',s:6:3)
end.
Рисунок 12.3 – Программа Example_23
Unit Studious;
Interface
uses CRT;
Type fun=function(x:real):real;
Function Integral(a,b:real;n:integer;f:fun):real;
Implementation
Function Integral(a,b:real;n:integer;f:fun):real;
var s,h:real;
i:integer;
begin
h:=(b-a)/n;
s:=0;
for i:=1 to n-1 do s:=s+f(a+i*h)*h;
integral:=s
end;
begin
clrscr;
Writeln('Работает модуль студента Сидорова')
end.
Рисунок 12.4 – Текст модуля Studious
В приведенной программе используется в качестве передаваемого параметра из основной программы в подпрограмму-функцию Integral параметр-функция F. Основное назначение такого типа параметров, называемых параметрами-функциями, - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров при обращении к другим процедурам и функциям. В качестве фактического параметра в этом случае используется соответствующая функция, имеющая необходимое число параметров требуемых типов.
Дата: 2019-03-05, просмотров: 239.