
- •Часть 2
- •Содержание
- •1 Цель работы
- •2 Построение многоугольников.
- •3 Практическое задание
- •4 Построение сложных линейчатых фигур
- •5 Практическое задание
- •6 Стили и режимы вывода линейчатых фигур
- •7 Практическое задание
- •1 Цель работы
- •2 Многократное рисование фигуры с поворотом относительно центра узора
- •3 Практическое задание
- •4 Создание узоров построением зеркальных отображений.
- •5 Практическое задание
- •6 Масштабирование вписыванием фигур
- •7 Практическое задание
- •8 Штриховка углов
- •9 Практическое задание
- •1 Цель работы
- •2 Наборы последовательно выводимых отрезков с изменением их ориентации
- •3 Практическое задание
- •4 Разветвляющиеся наборы отрезков
- •5 Практическое задание
- •6 Лабиринты Гильберта
- •5 Практическое задание
- •1 Цель работы
- •2 Алгоритмы Брезенхейма
- •3 Практическое задание
- •4 Построение кривых второго порядка
- •3 Практическое задание
- •Часть 2
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));
Рисунок 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.