- •Московский государственный технический университет
- •Содержание.
- •Предисловие
- •Лабораторная работа №1 Процедурные типы
- •1. Теоретические сведения
- •Var X: real; I: integer;
- •X, y : byte;
- •VarFunc : FuncType;
- •I : integer;
- •2.Задачи для самостоятельного решения
- •Лабораторная работа №2 Модули
- •Теоретическая часть
- •Структура модулей
- •Связь модулей друг с другом
- •ISwap(a,b);
- •Var I, y :integer;
- •2.2. Практическая часть
- •Interface
- •Implementation
- •I: Integer;
- •3. Задачи, для самостоятельного решения
- •Лабораторная работа №3 Меню
- •1. Теоретическая часть
- •Var X,y,I: byte;
- •XUpLeft;
- •Var npos,I: integer;
- •Case npos of
- •Лабораторная работа №4.
- •2.Задачи, для самостоятельного решения:
- •Лабораторная работа № 5 Указатели. Связанные списки
- •1. Теоретические сведения
- •1.1. Указатели
- •1.2. Связные списки записей
- •1.3. Управление связанным списком записей (на примере)
- •1.3.1. Построение списка
- •Var ListOfChecks, CurrentCheck: pCheck;
- •1.3.2. Перемещение по списку
- •Var p: Pint;
- •2. Демонстрационные примеры
- •X1,y1,x2,y2: word;
- •Var npos,I,n,j :integer;
- •3: Begin
- •Interface
- •Задачи 1..4. Создать типизированный файл записей, содержащих сведения о багаже пассажира. Структура записи имеет следующий вид:
- •Var rec, beg, endd, current: pnt;
- •Задача 5. Создать типизированный файл записей, содержащих сведения об автомобиле. Структура записи имеет следующий вид:
- •Var rec, beg, endd, current : pnt;
- •Задача 22. Создать типизированный файл записей, содержащих сведения о книгах. Структура записи имеет следующий вид:
- •1.2.Объект и инкапсуляция
- •1.3. Иерархия объектов и наследование
- •Visible: Boolean;
- •Init(x1,y1);
- •Interface
- •Interface
- •X,y : Integer;
- •Visible : Boolean;
- •Implementation
- •Var Temp : Word;
- •Var Temp : Word;
- •Var gm,gd:Integer;
- •Xp:Point;
- •Xs:Square;
- •Xps:PaintSquare;
- •InitGraph(Gd,Gm,'');
- •2. Демонстрационные примеры
- •X,y:integer;
- •Inherited init(ax,ay);
- •Задача 12. Простые объекты.
- •Задача 14. Простые объекты.
- •Задача 15. Простые объекты.
- •Задача 20. Простые объекты.
- •Задача 21. Простые объекты.
- •Задача 22. Простые объекты.
- •Задача 23. Простые объекты.
- •Задача 25. Простые объекты.
- •Лабораторная работа №8 Статические объекты
- •Теоретическая часть
- •1.1.Вывод точек и линий
- •1.2.Вывод многоугольников
- •Виды закраски определяется константами.
- •1.3.Вывод дуг, окружностей, эллипсов
- •1.4.Вывод текста
- •Демонстрационные примеры
- •Лабораторная работа №9
- •2. Задачи, для самостоятельного решения
- •Лабораторная работа №10
- •1.2. Перенос изображения
- •1.3. Масштабирование изображения
- •1.4. Масштабирование рисунка
- •1.5. Поворот изображения
- •1.5.1.Поворот точки
- •1.5.2. Поворот рисунка
- •1.6. Композиция преобразований
- •2. Демонстрационные примеры
- •X,y:integer;
- •1: CloseGraph;
- •3.Задачи, для самостоятельного решения
- •Лабораторная работа №12 Рубежный контроль №2
- •Задачи, для самостоятельного решения
2. Демонстрационные примеры
Пример 10.1.
program lab_31; {Выполнение преобразований на плоскости на примере плоской кривой - астроиды}
uses Graph,Crt;
label 1;
const b=120; {параметр астроиды}
fon=7; {цвет фона}
col=12; {цвет рисования}
type spis=^p;
p=record
X,y:integer;
praw:spis; {метод проверка}
end;
var i, {параметр цикла}
gd,gm, {тип и режим работы адаптера}
xn,yn, {координаты центра астроиды}
x,y, {координаты текущей точки исходной астроиды}
x1,y1, {координаты текущей точки преобразованной астроиды}
xnc,ync, {координаты начальной точки астроиды}
n, {количество точек, аппроксимирующих астроиду}
xc,yc, {координаты центра поворота}
xm,ym, {координаты центра масштабирования}
dx,dy: integer; {величины смещений}
a,c,d,f, {рабочие переменные}
dt, {шаг изменения аргумента при аппроксимации}
t, {текущее значение аргумента}
kx,ky, {коэффициенты масштабирования}
kx1,ky1, {единица минус коэффициент масштабирования}
ug, {угол поворота в градусах}
ur, {угол поворота в радианах}
rx,ry, {отношения коэффициентов, учитывающих разрешающие cпособности}
sur,cur: real; {значение синуса и косинуса угла поворота}
xa,ya:word; {коэффициенты учета разрешающих способностей}
nach, {указатель на начало списка}
kon, {указатель на конец списка}
rab: spis; {текущий указатель}
pr: char; {признак выбираемой функции}
begin
nach:=nil; {указатель на начало списка}
kon:=nil; {указатель на конец списка}
rab:=nil; {текущий указатель}
gd:=detect;
InitGraph(gd,gm,'d:\turbo');
GetASpectRatio(xa,ya);
xn :=GetMaxX div 2;{координаты центра}
yn:=GetMaxY div 2; {кривой}
dt:=2.0/3.0/b; {шаг изменения аргумента}
n:=round(2*pi/dt);
{вычисление координат точек исходной астроиды}
{и формирование списка, хранящего координаты}
for i:=1 to n do
begin
t:=(i-1)*dt;
a:=cos(t);
c:=a*a*a;
x:=xn+round(b*c);
f:=sin(t);
d:=f*f*f;
y:=yn-round(b*d*xa/ya);
new(rab); {создает новую динамическую переменную типа rab}
rab^.x:=x;
rab^.y:=y;
if t=0 then nach:=rab
else kon^.praw:=rab;
kon:=rab;
end;
repeat
RestoreCrtMode; {восстанавливает текстовый режим экрана}
writeln('Выберите нужную функцию');
writeln('Исходное изображение - i(I)');
writeln('Перенесенное изображение - p(P)');
writeln('Промасштабированное изображение - m(M)');
writeln('Повернутое изображение - w(W)');
writeln('Конец работы - e(E)');
pr:=UpCase(ReadKey);
case pr of
'P': begin
writeln('Введите величины смещений (dx,dy)');
readln(dx,dy);
end;
'M': begin
writeln('Введите координаты центра масштабирования');
writeln('(координаты центра астроиды',xn:5,yn:5,')');
readln(xm,ym);
writeln('Введите коэффициенты масштабирования');
readln(kx,ky);
end;
'W': begin
writeln('Введите координаты центра поворота');
writeln('(координаты центра астроиды',xn:5,yn:5,')');
readln(xc,yc);
writeln('Введите угол поворота');
readln(ug);
end;
'E': goto 1;
else;
end;
SetGraphMode(GetGraphMode); {установить графический режим}
SetBkColor(fon);
SetColor(col);
rab:=nach;
kx1:=1-kx;
ky1:=1-ky;
ur:=ug*pi/180;
sur:=sin(ur);
cur:=cos(ur);
rx:=xa/ya;
ry:=ya/xa;
while rab<>nil do
begin
x:=rab^.x;
y:=rab^.y;
case pr of
'I': begin
x1:=x;
y1:=y;
end;
'P': begin
x1:=x+dx;
y1:=y+dy;
end;
'M': begin
x1:=round(x*kx+xm*kx1);
y1:=round(y*ky+ym*ky1);
end;
'W': begin
x1:=round(xc+(x-xc)*cur+(y-yc)*sur*ry);
y1:=round(yc+(y-yc)*cur-(x-xc)*sur*rx);
end;
else ;
end;
if nach=rab then
begin
xnc:=x1;
ync:=y1;
MoveTo(xnc,ync); {смещает текущий указатель к точке}
end
else LineTo(x1,y1); {рисует линию от текущего указателя до точки}
rab:=rab^.praw;
end;
LineTo(xnc,ync);
readln;
until (pr='E');