Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







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





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

 

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

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

xi, yi - координаты отображаемой точки в системе координат экрана,

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

 

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

 

xf xoi xi X

0 xoi = xi + 2*yzi*sin(A);

yf * yoi = yi - 2*yzi*cos(A);

yi

yoi

 

XZ

 

Y YZ

 

Приведем пример операторов для расчета координат 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 для подсвечника со свечой.

 

 

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

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

 

Procedure UGOL(x1, y1, x2, y2, x3, y3, N: integer);

var xx1, xx2, yy1, yy2, i: integer; k: real;

Begin

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){ линия штриховки угла }

End

end;

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



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

 

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

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

 

 

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

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

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

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);{ рекурсивный вызов процедуры }

end;

{ (x, y), (x1, y1) - координаты начала и конца отрезка }

begin ugol:= 0; alfa:= 13; l:= 10; delta:= 3;

Gd:= Detect; InitGraph(Gd, Gm, 'с:\tp7\bgi');

OTREZOK(GetMaxX div 2, GetMaxY div 2);{ вызов процедуры }

readln; CloseGraph;

End.

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

 

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

 

1. С использованием процедуры OTREZOK построить (при alfa= 90o) прямоугольный и ромбический спиралевидные лабиринты из отрезков разного цвета.

2. Построить прямоугольник со сторонами разного цвета и основанием, движущимся согласно процедуре OTREZOK.

 

 

Следующий пример показывает использование рекурсии при построении узоров, напоминающих кружева. Задается размер "стежка" - короткой линии длиной dl, функция варьирования угла перемещения ugol в зависимости от номера шага n.

uses Graph;

var gD, gM, n, x, y, x1, y1, k: integer; dl, ugol, ugol_0, s, i: real;

{-----------------------------------------------------------------}

PROCEDURE ANGLE(x, y: integer);

begin n:= n+1;

ugol:=2*pi*n/s; ugol_0:=ugol;{ равномерное увеличение угла по параметру n }

ugol:= ugol_0 + i*sin(k*ugol);{ периодическое отклонение угла:

параметр i определяет амплитуду, k - частоту отклонений }

x1:= x + round(dl*cos(ugol));{ (x1, y1) - координаты следующей точки }

y1:= y + round(dl*sin(ugol));

Line(x, y, x1, y1);{ рисуем "стежок" }

if n<s then ANGLE(x1, y1){ рекурсивный вызов }

end;

begin gD:= Detect; InitGraph(gD, gM, 'z:\tp7\bgi');

ugol_0:= 0;{ начальное значение угла }

n:= -1;{ начальное значение счетчика изменения угла }

x:= 300; y:= 70;{ координаты начала рисования }

dl:= 4;{ размер линии ("стежка") }

k:= 8;{ количество циклических изменений угла }

s:= 500;{ количество "стежков" узора }

i:= 2. ;{ амплитуда циклических изменений угла }









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.