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) { рисование узора }
Until KeyPressed; CloseGraph
END.
Практическое задание N 1. 61
1. Смоделировать детский калейдоскоп для набора из трех разноцветных "кристаллов" (3-х, 4-х и 5-ти угольников), размещенных в одном секторе.
2. Смоделировать калейдоскоп с 8 осями симметрии. Смещая при каждом изменении фигуры на пять пикселов диапазон задания координат "х" точек исходной ломанной (10 раз увеличивая, затем 10 раз уменьшая получить пульсирующее движение фигур.
3. Смоделировать вращение узора, полученного из отражений ломанной линии.
4. Смоделировать случайное перемещение узора, полученного из отражений ломанной линии. Контролировать выход узора за границу экрана.