TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

         Практическое задание N .  1. 61

            1.  С использованием процедуры ANGLE построить 14-лепестковый узор без самопересечений с разным цветом для каждого лепестка узора.  Построить эллиптический узор,  задав вместо dl два различных значения dlx и dly.

            2.  Построить "кружевную ленту" с базовой линией узора в форме синусоиды: вместо оператора ugol_0:= ugol; подставить ugol_0:= Pi/4*sin(ugol);.

3.   Построить "кружевную рамку",  задавая поворот базовой линии через определенное число циклических изменений угла: ugol_0:= ugol_0 + pi/2;.

 

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

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

  Y

                             ось

        *         симметрии

 

 


                      *

                                      X

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

{ ---------- ------------     "Калейдоскоп":        ------------------------

Строится фигура в виде ломаной линии,  состоящей из "m-1" отрезков прямых и "n" зеркальных отражений этой ломаной относительно осей симметрии,  проходящих через центр узора.

------------------------------------- ------------ }

Uses Graph,  Crt;

type mas = array[1..40, 1..20] of integer;

var Gd, Gm, n, m, i, j,

      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;

 

100

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

        { процедура расчета координат отражений точки (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.

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz