Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Методические указание / Линейчатые графические образы.DOC
Скачиваний:
22
Добавлен:
15.06.2014
Размер:
878.59 Кб
Скачать

2 Многократное рисование фигуры с поворотом относительно центра узора

Наиболее простой, но при этом достаточно эффективно работающий метод синтеза узоров состоит в том, что центр многократно рисуемой фигуры (xf, yf) перемещают после очередного рисования относительно центра узора (xc,yc) по какому-либо закону ( рисунок 1).

За "центр фигуры" может быть принята любая точка, жестко связанная с фигурой.

0 yc xf X

xc c Fx

xf = xc + Fx("параметры"),

Fy yf = yc + Fy("параметры").

yf f

Y

Рисунок 1

Опишем в общем виде принцип составления программы рисования при вычислении Fx и Fy через радиус-вектор из центра узора.

for i:=1 to n do begin { перебор фигур, составляющих узор }

ugol:=F_u(i); { угол поворота очередной фигуры }

r:=F_r(i); { расстояние от центра узора до центра фигуры }

rf:=F_f(i); { размер фигуры }

color:=F_c(i); { цвет фигуры }

x:=xc+round(r*cos(ugol));{ координаты центра очередной фигуры }

y:=yc+round(r*sin(ugol));

{ вывод фигуры вызовом процедуры рисования }

F_picture( x,y, rf, color) end;

Подбором функций F_u( i), F_r( i), F_f( i), F_c( i), числа и вида фигур можно добиться самых разнообразных декоративных эффектов. В общем случае фигура может перемещаться с вращением и деформироваться. Примеры функций для построения узоров из окружностей и из квадратов ( рисунок 2):

xc:=100; yc:=100; { центр узора }

n:=12; { число фигур, составляющих узор }

for i:=1 to n do begin

ugol:=2*pi*i/n;

r:=10*(i mod 2 +2);

rf:=20*(i mod 2 +1);

color:=(i-1) mod 3 +10;

x:=xc+round( r*cos(ugol));

y:=yc+round( r*sin(ugol));

setcolor(color); circle(x,y,rf) end;

yc:=300; for i:=1 to n do begin

ugol:=2*pi*i/n;

r:=40; rf:=30;

x:=xc+round(r*cos(ugol));

y:=yc+round(r*sin(ugol));

rectangle(x-rf, y-rf, x+rf, y+rf) end;

Рисунок 2

3 Практическое задание

3.1 Нарисовать узор из 24 эллипсов с центром узора в середине экрана. Радиусы очередного эллипса (Rx, Ry) и расстояние до центра узора циклически изменять.

3.2 Нарисовать узор из 20 прямоугольников. Длины сторон прямоугольников и расстояние от центра узора до левого верхнего угла прямоугольника изменять по закону, который обеспечит приемлемый декоративный эффект.

3.3 Нарисовать узор отрезком прямой , который вращается вокруг своего центра, а этот центр в свою очередь делает один оборот вокруг центра узора.

4 Создание узоров построением зеркальных отображений.

Большинство людей впервые знакомятся с некоторыми принципами построения узоров, изучая детский зеркальный калейдоскоп, где система из трех зеркал создает эффект нескольких шестикратных отражений набора цветных кристаллов. Математически такой принцип построения узора можно описать следующим образом.

Имеется N выходящих из одной точки лучей - осей симметрии. Угол между лучами равен 2*/N. Строится исходная фигура в секторе между первым и вторым лучами. Затем строится вторая фигура как зеркальное отображение первой фигуры относительно второго луча, третья фигура, как зеркальное отображение второй фигуры относительно третьего луча и так далее. Если N - четно, то исходная фигура будет также зеркальным отражением последней фигуры и получившийся узор будет симметричным . Если нет необходимости моделировать реальные отражения, то исходную фигуру можно строить с пересечением осей симметрии и по любому количеству секторов.

Ниже приведен пример программы создания узора построением отражений m точек относительно N осей отражения (зеркал). Исходная фигура - замкнутая ломаная, состоящая из разноцветных отрезков прямых ( рисунок 4). Для каждой узловой точки линии определяется расстояние до центра узора (радиус r). Угол (ugol), под которым расположена узловая точка относительно горизонтальной линии, вычисляется как арктангенс отношения ординаты X к абсциссе Y (в системе координат центра узора). Угол, под которым расположена отраженная точка ( рисунок 3), увеличивается на величину, равную удвоенной разности между углом наклона оси отражения и углом расположения отражаемой точки.

uses Graph, Crt;

type mas= array[1..20] of longint;

var Gd,Gm, N,M, i,j, k,l,

xc,yc: integer;{ центр узора}

r: real; { расстояние от центра узора до узла фигуры }

xm,ym, { координаты узлов исходной фигуры }

xn,yn, { координаты узлов отражения фигуры }

xr,yr: mas; { координаты точек осей симметрии ("зеркал")}

alf: array[1..20] of real; { угол между "зеркалом" и осью X }

x,y: array[1..30,1..20] of integer;{ координаты отражений узлов}

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

PROCEDURE UZOR(xm,ym: mas);

{ процедура построения узора в виде ломаной линии из M отрезков}

begin

moveto( xm[M],ym[M]);

for l:=1 to M do begin

{ в зависимости от значения k фигура либо рисуется,

либо стирается ранее нарисованная фигура }

if k=1 then setcolor(l mod 7+9)

else setcolor(0);

lineto( xm[l],ym[l]) end

end;

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

PROCEDURE MIRROR(k,xn,yn: integer);

{ процедура расчета координат отражений узла узора

относительно центра узора }

var delt, { разность углов отражаемого узла и "зеркала" }

ugol: { угол для узла-отражения }

array[1..20] of real;

begin

xm[1]:=xc+xn; Y

ym[1]:=yc-yn; { абсолютные координаты } ось

ugol[1]:=arctan((yc-ym[1])/(xm[1]-xc)); симметрии

r:=sqrt( (xm[1]-xc)*(xm[1]-xc)

+(ym[1]-yc)*(ym[1]-yc) );

for i:=1 to N-1 do begin X

delt[i]:=alf[i]-ugol[i]; Рисунок 3

ugol[i+1]:=ugol[i]+2*delt[i];{ угол очередного узла-отражения }

xm[i+1]:=xc +round( r*cos(ugol[i+1])); { и его координаты }

ym[i+1]:=yc -round( r*sin(ugol[i+1])) end end;

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

begin Gd:=0; InitGraph(Gd,Gm,'');

xc:=GetmaxX div 2; yc:=GetmaxY div 2;

N:=12; { число "зеркал" и их цвет } setcolor(8);

for i:=1 to N do begin

{ вывод "зеркал"}

alf[i]:=2*PI*i/N;

xr[i]:= xc +round( 150*cos(alf[i]));

yr[i]:= yc -round( 150*sin(alf[i]));

line( xr[i],yr[i],xc,yc) end;

M:=10; { число отрезков узора }

REPEAT

Randomize;

{ расчет массивов координат M*N всех отражений }

for j:=1 to M do begin

MIRROR( N,random(200)+1,random(100));

for i:=1 to N do begin

x[j,i]:=xm[i]; Рисунок 4

y[j,i]:=ym[i]

end end;

{ построение N фигур по M узлов в каждой }

for k:=1 to 2 do begin

if k=2 then delay(3000); { задержка для просмотра }

for i:=1 to N do begin

for j:=1 to M do begin

xn[j]:=x[j,i];

yn[j]:=y[j,i] end;

UZOR(xn,yn) end end { вызов процедуры построения узора }

until KeyPressed; CloseGraph end.