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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| 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
delt[i]:=alf[i]-ugol[i];
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; X
{---------------------------------------------------------} Рисунок 3
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];
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 Рисунок 4
xn[j]:=x[j,i];
yn[j]:=y[j,i] end;
UZOR(xn,yn) end
end { вызов процедуры построения узора }
until KeyPressed;
CloseGraph end |