Rz,{ длина зеркала }
xc, yc,{ координаты центра узора }
xr, yr: integer;{ координаты концов зеркал }
alf: real;{ угол между зеркалом и осью X }
x, y: mas;{ координаты узлов фигуры }
{---------------------------------------------------------------- }
{ процедура построения фигуры в виде ломаной линии с "m" узлами }
Procedure UZOR(m, n: integer; x, y: mas);
Var i, j : integer;
ugol : real;
Begin
for j:= 1 to n do begin
moveto(x[m,j],y[m,j]);{ установка курсора в m-ную точку ломаной }
for i:= 1 to m do begin{ цикл рисования j-ой ломаной по m точкам }
setcolor(i mod 7+9);
lineto(x[i, j], y[i, j])
End end
end;
{-----------------------------------------------------------------}
{ процедура расчета координат отражений точки (x, y) относительно центра узора}
Procedure MIRROR(n, m: integer; var x, y: mas);
var i, j : integer;
r, ugol: real;{ координаты точки в полярной системе координат }
Begin
for i:= 1 to m do begin
if x[i,1]<>0 then ugol:=arctan(y[i,1]/x[i,1]) else ugol:=Pi/2;
r:= sqrt(1.*x[i,1]*x[i,1]+y[i,1]*y[i,1]);
for j:= 1 to n do begin
ugol:= 4*Pi*j/n - ugol;
x[i,j]:=round(r*cos(ugol)); y[i,j]:=round(r*sin(ugol)) end
End
end;
{ ---------------------------------------------------------------- }
BEGIN Gd:= Detect; InitGraph(Gd, Gm, 'C:\tp7\bgi'); SetWriteMode(1);
xc:= GetmaxX div 2; yc:= GetmaxY div 2; { координаты центра узора }
n:= 12;{ число зеркал }
m:= 10;{ число узловых точек ломаной }
Rz:= 150;{ длина линии зеркала }
for i:= 1 to n do begin alf:= 2. *PI*i/n;
xr:= xc + round(Rz*cos(alf));
yr:= yc - round(Rz*sin(alf));
setcolor(7); line(xr,yr,xc,yc) { построение линий зеркал }
end;
Randomize;
Repeat
for i:= 1 to m do begin{расчет координат точек исходной фигуры }
x[i,1]:= Random(200)+1; y[i,1]:= Random(100) end;
MIRROR(n, m, x, y);{ расчет координат отраженных точек
в системе координат узора }
for i:= 1 to m do{ расчет координат точек узора}
for j:= 1 to n do begin{ в системе координат экрана }
x[i,j]:= x[i,j] + xc; y[i,j]:= y[i,j] + yc end;
UZOR(m,n,x,y); delay(1000); UZOR(m,n,x,y) { рисование узора }