Файл:Вращающиеся треугольники Серпинского.png

Содержимое страницы недоступно на других языках.
Материал из Викиучебника — открытых книг для открытого мира

Вращающиеся_треугольники_Серпинского.png(637 × 475 пкс, размер файла: 163 Кб, MIME-тип: image/png)

Краткое описание

Описание
Русский: Вращающиеся треугольники Серпинского
English: Rotating Sierpinski Triangles
Дата
Источник Собственная работа
Автор Владислав Молдован

Pascal src code

  • N - specifies three iterations of the for loop
  • M - number of fractals
  • Angle - angle of rotation when drawing a triangle

}}

uses GraphABC; 
const
  N = 2; 
  M = 20; 
  Angle = 120;

var
  W, H: integer;

type
  Fractal = class 
    CenterX, CenterY, Length: integer; 
    C: Color; 
    Ang: real; 
    Points: array [0..N] of Point;
    
    constructor ();
    begin
      for var i := 0 to N do 
        Points[i] := new Point(0, 0); 
      Length := Random(100); 
      C := clRandom(); 
      CenterX := Random(W); 
      CenterY := Random(H); 
    end;
    
    procedure Draw(x, y, x1, y1, x2, y2: integer);
    begin
      Line(x, y, x1, y1);
      Line(x1, y1, x2, y2);
      Line(x2, y2, x, y);
      
      var cx1 := (x + x1) div 2; 
      var cy1 := (y + y1) div 2; 
      var cx2 := (x1 + x2) div 2; 
      var cy2 := (y1 + y2) div 2; 
      var cx3 := (x2 + x) div 2; 
      var cy3 := (y2 + y) div 2;
      
      if Sqrt(Sqr(cx2 - cx1) + Sqr(cy2 - cy1)) > 10 then 
      begin
        Draw(x, y, cx1, cy1, cx3, cy3); 
        Draw(x1, y1, cx1, cy1, cx2, cy2); 
        Draw(x2, y2, cx2, cy2, cx3, cy3); 
      end; 
    end;
    
    procedure RedrawFractal();
    begin
      SetPenColor(C);
      
      for var i := 0 to N do 
      begin
        var ang1 := DegToRad(Angle * i + Ang);
        Points[i].X := Round(CenterX + Length * Cos(ang1)); 
        Points[i].Y := Round(CenterY + Length * Sin(ang1)); 
      end;
      Draw(Points[0].X, Points[0].Y, Points[1].X, Points[1].Y, Points[2].X, Points[2].Y);
      
      for var i := 0 to N do 
      begin
        var ang1 := DegToRad(Angle * i - Ang);
        Points[i].X := Round(CenterX + Length * Cos(ang1)); 
        Points[i].Y := Round(CenterY + Length * Sin(ang1)); 
      end;
      Draw(Points[0].X, Points[0].Y, Points[1].X, Points[1].Y, Points[2].X, Points[2].Y);
      
      Ang := Ang + 1; 
    end; 
  end;

var
  Fractals: array [0..M] of Fractal;

begin
  W := Window.Width;
  H := Window.Height;
  
  SetWindowIsFixedSize(true);
  LockDrawing();
  
  for var i := 0 to M do
    Fractals[i] := new Fractal(); 
  
  while true do 
  begin
    ClearWindow(clBlack); 
    for var i := 0 to M do 
      Fractals[i].RedrawFractal(); 
    Redraw(); 
  end; 
end.
{Адаптировано под PascalABC 3.0.1.35.}
uses GraphABC, PointRect;
const
  N = 30;
  M = 20;
  Angle = 120;

var
  W, H: integer;

function DegToRad(x: real): real;
begin
  Result := x * 0.0174533;
end;

type
  Fractal = class
    CenterX, CenterY, Length: integer;
    C: ColorType;
    Ang: real;
    Points: array [0..N] of Point;

    constructor Create;
    var
      i: integer;

    begin
      for i := 0 to N do
        Points[i] := PointF(0, 0);
      Length := Random(100);
      C := RGB(Random(255), Random(255), Random(255));
      CenterX := Random(W);
      CenterY := Random(H);
    end;

    procedure Draw(x, y, x1, y1, x2, y2: integer);
    var
      cx1, cy1: integer;
      cx2, cy2: integer;
      cx3, cy3: integer;
      
    begin
      Line(x, y, x1, y1);
      Line(x1, y1, x2, y2);
      Line(x2, y2, x, y);

      cx1 := (x + x1) div 2;
      cy1 := (y + y1) div 2;
      cx2 := (x1 + x2) div 2;
      cy2 := (y1 + y2) div 2;
      cx3 := (x2 + x) div 2;
      cy3 := (y2 + y) div 2;

      if Sqrt(Sqr(cx2 - cx1) + Sqr(cy2 - cy1)) > 10 then
      begin
        Draw(x, y, cx1, cy1, cx3, cy3);
        Draw(x1, y1, cx1, cy1, cx2, cy2);
        Draw(x2, y2, cx2, cy2, cx3, cy3);
      end;
    end;

    procedure RedrawFractal;
    var
      i: integer;
      ang1: real;
      
    begin
      SetPenColor(C);

      for i := 0 to N do
      begin
        ang1 := DegToRad(Angle * i + Ang);
        Points[i].X := Round(CenterX + Length * Cos(ang1));
        Points[i].Y := Round(CenterY + Length * Sin(ang1));
      end;
      Draw(Points[0].X, Points[0].Y, Points[1].X, Points[1].Y, Points[2].X, Points[2].Y);

      for i := 0 to N do
      begin
        ang1 := DegToRad(Angle * i - Ang);
        Points[i].X := Round(CenterX + Length * Cos(ang1));
        Points[i].Y := Round(CenterY + Length * Sin(ang1));
      end;
      Draw(Points[0].X, Points[0].Y, Points[1].X, Points[1].Y, Points[2].X, Points[2].Y);

      Ang := Ang + 1;
    end;
  end;

var
  A: array [0..M] of Fractal;
  i: integer;

begin
  W := WindowWidth();
  H := WindowHeight();

  LockDrawing();

  for i := 0 to M do
    A[i] := Fractal.Create();

  while true do
  begin
    ClearWindow(clBlack);
    for i := 0 to M do
      A[i].RedrawFractal();
    Redraw();
  end;
end.

Лицензирование

Я, владелец авторских прав на это произведение, добровольно публикую его на условиях следующей лицензии:
w:ru:Creative Commons
атрибуция распространение на тех же условиях
Этот файл доступен по лицензии Creative Commons Attribution-Share Alike 4.0 International
Вы можете свободно:
  • делиться произведением – копировать, распространять и передавать данное произведение
  • создавать производные – переделывать данное произведение
При соблюдении следующих условий:
  • атрибуция – Вы должны указать авторство, предоставить ссылку на лицензию и указать, внёс ли автор какие-либо изменения. Это можно сделать любым разумным способом, но не создавая впечатление, что лицензиат поддерживает вас или использование вами данного произведения.
  • распространение на тех же условиях – Если вы изменяете, преобразуете или создаёте иное произведение на основе данного, то обязаны использовать лицензию исходного произведения или лицензию, совместимую с исходной.

Краткие подписи

Добавьте однострочное описание того, что собой представляет этот файл

Элементы, изображённые на этом файле

изображённый объект

image/png

История файла

Нажмите на дату/время, чтобы увидеть версию файла от того времени.

Дата/времяМиниатюраРазмерыУчастникПримечание
текущий09:32, 1 сентября 2017Миниатюра для версии от 09:32, 1 сентября 2017637 × 475 (163 Кб)Владислав МолдованUser created page with UploadWizard

Следующая страница использует этот файл:

Метаданные