Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[31]

N:= 7; R:= 170; xc:= GetMaxX div 2; yc:= GetMaxY div 2;

for i:= 1

to N do begin alfa:= i*2. *pi/N; x[i]:= xc + round(R*cos(alfa)); y[i]:= yc + round(R*sin(alfa))

{ координаты вершин } { исходного N-угольника }

for i:= 1 to N do

{ рисуем N- угольник } { нажать клавишу }

x1:= x[1]

for i:=1 to N-1 do begin

MoveTo(x[N], y[N]); LineTo(x[i], y[i]);

ch:= ReadKey;

{ найдем середины сторон многоугольника и запишем их в массивы новых координат многоугольника }

y1:= y[1];

x[i]:= (x[i]+x[i+1]) div 2; y[i]:= (y[i]+y[i+1]) div 2 end; x[N]:= (x[N]+x1) div 2; y[N]:= (y[N]+y1) div 2;

{ строим многоугольник по новым точкам } MoveTo(x[N], y[N] ) ; for i:=l to N do LineTo(x[i], y[i]);

ch:=ReadKey;

Until ch=#27;

При нажатии клавиши внутрь фигуры будет "убегать" ее уменьшенная копия до нажатия клавиши Esc. Стороны можно делить не пополам, а в каком-либо соотношении. Для стирания фигуры необходимо перерисовать ее в режиме XorPut.

Масштабирование фигур можно проводить используя зависимости, приведенные выше для вращения фигуры относительно своего "центра", изменяя Kx и Ky, при постоянных параметрах xf, yf, A.

Практическое задание N 1. 57

пульсирующий тре-

1.Создать уменьшающийся треугольник (деление сторон 9:1) угольник.

2.Создать уменьшающийся прямоугольник (деление сторон 3:1) и пульсирующий прямоугольник.

Примечание к п. 1 и п. 2: пульсация фигуры достигается перерисовкой ее в режиме XorPut, при многократном увеличении и последующем уменьшении коэффициента масштабирования, например, по закону: K= K + i*0. 02. Где i - параметр цикла.

3. Симметричное отображение фигуры.

Пусть хz - ось зеркальной симметрии, тогда координата "yzi" i-ой точки фигуры в системе координат (xz, yz) определяется по формуле:

yzi= (yi-yf) *cos(A)-(xi-xf) *sin(A),

где xf, yf - координаты любой точки на оси зеркальной симметрии, xi, yi - координаты отображаемой точки в системе координат экрана,

2. Масштабирование фигуры.

Рассмотрим случай уменьшения размеров фигуры делением ее сторон.


A - угол наклона оси симметрии относительно оси "x" по часовой стрелке.

Тогда координаты отраженной точки в системе координат (X0Y) определяются по формулам:

xoi xi

-►

..................*-

xoi = xi + 2*yzi*sin(A); yoi = yi - 2*yzi*cos(A);

Приведем пример операторов для расчета координат xo[ i], yo[ i] точек фигуры зеркально отображенной относительно оси, наклоненной под углом "A" и проходящей через точку с координатами xf, yf.

for i:= 1 to N do begin

yzi:= round((y[i]-yf)*cos(A) - (x[i]-xf)*sin(A)); xo[i]:= x[i] + 2*round(yzi*sin(A)); yo[i]:= y[i] - 2*round(yzi*cos(A)) end;

Практическое задание N 1. 58

1.Нарисовать елку с основанием в центре экрана и получить три зеркальных отображения относительно осей, проходящих через центр экрана под углом +450, 00, -450 к оси "х".

2.Выполнить п. 1 для подсвечника со свечой.

4. Штриховка углов.

Определим координаты отрезков, образующих стороны угла и поделим их на N-частей. Соединим попарно точки раздела сторон угла так, чтобы наиболее удаленная от вершины угла точка на одной стороне соединялась с наименее удаленной точкой на другой стороне. Приведем процедуру штриховки угла.

Procedure UGOL(x1, y1, x2, y2, x3, y3, N: integer); var xx1, xx2, yy1, yy2, i: integer; k: real;

for i:= 1 to N+1 do begin k:= (i-1)/N;

xx1:=x1+round((x2-x1)*k); yy1:=y1+round((y2-y1)*k); xx2:=x2+round((x3-x2)*k); yy2:=y2+round((y3-y2)*k));

line(xx1, yy1, xx2, yy2){ линия штриховки угла }


5. Использование рекурсии.

В программировании иногда используют рекурсивные операторы, например, процедуры, которые содержат обращение к самим себе. Это обращение может быть прямое - вызовом процедуры внутри самой процедуры, или косвенное - вызовом других процедур, внутри которых есть вызов исходной процедуры.

Рекурсия позволяет компактно реализовать некоторые алгоритмы. При этом нужно корректно определять условие прекращения работы рекурсивной процедуры во избежание зацикливания программы. Приведем пример рекурсивного построения узора последовательным построением отрезков прямых:

Uses Graph;

var Gd, Gm, x1, y1,{ x1, y1 - координаты конца отрезка }

l, delta,{ l, delta - длина отрезка и ее приращение }

alfa, ugol: integer; { alfa - угол поворота, ugol - текущий угол в градусах } Procedure OTREZOK(x, y: integer); begin x1:= x + round(l*cos(ugol*pi/180));

y1:= y - round(l*sin(ugol*pi/180));

line(x, y, x1, y1); ugol:= ugol + alfa;{ изменение угла }

l:= l + delta;{ изменение длины отрезка }

{условие продолжения рекурсии: }

if (x1 > 0) and (x1 < GetMaxX) and (y1 > 0) and (y1 < GetMaxY)

then OTREZOK(x1, y1);{ рекурсивный вызов процедуры }

{ (x, y), (x1, y1) - координаты начала и конца отрезка } begin ugol:= 0; alfa:= 13; l:= 10; delta:= 3;

Gd:= Detect; InitGraph(Gd, Gm, c:\tp7\bgi); OTREZOK(GetMaxX div 2, GetMaxY div 2);{ вызов процедуры }

readln;CloseGraph;

Узор получается перемещением отрезка с вращением вокруг точки (x, y). Поскольку внутри процедуры OTREZOK происходит вызов этой же процедуры с фактическими параметрами

Здесь x2, y2 - координаты вершины угла, x1, y1, x3, y3 - координаты крайних точек сторон. Коэффициент "k" определяет удаленность точки от вершины угла. Огибающая пересекающихся отрезков образует параболическую границу.

Практическое задание N 1. 59

1.Составить программу рисования звезды с N- вершинами, имеющими перекрестную штриховку углов. Звезда получается вращением угла вокруг центра, лежащего на биссектрисе на расстоянии, равном удвоенной длине стороны угла.

2.В предыдущей задаче центр узора располагать на биссектрисе с внешней стороны угла.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53]