Лучшие вопросы
Таймлайн
Чат
Перспективы

Треугольник Серпинского

вид фрактала Из Википедии, свободной энциклопедии

Треугольник Серпинского
Remove ads

Треугольник Серпи́нского — фрактал, один из двумерных аналогов множества Кантора, математическое описание которого опубликовал польский математик Вацлав Серпинский в 1915 году[1]. Также известен как «салфетка» Серпинского.

Thumb
Треугольник Серпинского

На основе треугольника Серпинского могут быть изготовлены многодиапазонные фрактальные антенны.[2][3]

Образования, похожие на треугольник Серпинского, возникают при эволюции многих конечных автоматов, подобных игре Жизнь[4].

В 2024 году Международная команда исследователей сообщила об открытии белка цитратсинтазы в цианобактерии Synechococcus elongatus[англ.], который самоорганизуется в треугольник Серпинского, это первый известный молекулярный фрактал[5].

Remove ads

Построение

Итеративный метод

Построение треугольника Серпинского

Середины сторон равностороннего треугольника соединяются отрезками. Получаются 4 новых треугольника. Из исходного треугольника удаляется внутренность срединного треугольника. Получается множество , состоящее из 3 оставшихся треугольников «первого ранга». Поступая точно так же с каждым из треугольников первого ранга, получим множество , состоящее из 9 равносторонних треугольников второго ранга. Продолжая этот процесс бесконечно, получим бесконечную последовательность , пересечение членов которой есть треугольник Серпинского.

Метод хаоса

1. Задаются координаты аттракторов — вершин исходного треугольника .
2. Вероятностное пространство разбивается на 3 равных части, каждая из которых соответствует одному аттрактору.
3. Задаётся некоторая произвольная начальная точка .
4. Начало цикла построения точек, принадлежащих множеству треугольника Серпинского.
1. Генерируется случайное число .
2. Активным аттрактором становится та вершина, на вероятностное подпространство которой выпало сгенерированное число.
3. Строится точка с новыми координатами: , где:
 — координаты предыдущей точки ;  — координаты активной точки-аттрактора.
5. Возврат к началу цикла.
Remove ads

Свойства

  • Треугольник Серпинского состоит из 3 одинаковых частей, коэффициент подобия 1/2.
  • Треугольник Серпинского замкнут.
  • Треугольник Серпинского имеет топологическую размерность 1.
  • Треугольник Серпинского обладает самоподобием
  • Треугольник Серпинского имеет промежуточную (то есть нецелую) Хаусдорфову размерность . В частности,
  • Если в треугольнике Паскаля все нечётные числа окрасить в чёрный цвет, а чётные — в белый, то образуется треугольник Серпинского.
Remove ads

В искусстве

Реализации

Суммиров вкратце
Перспектива

JavaScript (html5)

Аппроксимация квадратами

Thumb
Картинка, генерируемая кодом на JavaScript
   let k = Math.sqrt(3)/2, S = 16, H = 512, W = Math.floor(H/k);

   let canvas = document.createElement("canvas");
   let ctx = canvas.getContext('2d');

   document.body.append(canvas);
   canvas.width = W;
   canvas.height = H;

   ctx.fillRect(0, 0, W, H);

   for(let x = 0; x <= Math.floor(W/2); x++) {

        for(let y = 0; y < H; y++) {

             let A = y, a = A%S;
             let B = y/2+x*k, b = B%S;
             let C = y/2-x*k, c = C%S;

             if(a > b && C > 0 && B > 0) {

                  if ( (B/S) & (C/S) ) ctx.fillStyle='#ff0'; else ctx.fillStyle='#000';

                  }
             else if(a < b && C > 0 && B > 0) ctx.fillStyle='#0f8';
             else ctx.fillStyle='#fff';

             ctx.fillRect(Math.floor(W/2)-x, y, 1, 1);

             if (x!=0) ctx.fillRect(Math.floor(W/2)+x, y, 1, 1);

             }
        }

Рекурсивный метод

Thumb
   const depth = 7;
   const basecolor = "black";
   const fillcolor = "white";

   // ain't iteration a bit nicer via timer?
   // (calculations become smooth & async)

   const timestep = 300; // ms

   // define html5 canvas
   const width = 700; // px

   const canv = document.createElement("canvas");
   const ctx = canv.getContext("2d");

   // don't wish to deal with right triangles, so just re-scale canv style

   canv.width = width;
   canv.height = width;

   canv.style.height = width*Math.sqrt(3)/2;
   canv.style.width = width;

   document.body.append(canv);

   let triangle = (x, y, w, color=fillcolor, r=false) => {

        // take square coordinates and width for simplycity
        // also (r)otate triangle if needed, V by default

        ctx.beginPath();
        ctx.moveTo(x + w/2, r? y : width-y);
        ctx.lineTo(x + w, r? (w + y) : width- (y + w) );
        ctx.lineTo(x, r? (w + y) : width- (y + w) );

        ctx.fillStyle = color;
        ctx.fill();
        ctx.closePath();

        }

   let recstep = (x, y, wi, de) => {

        if (de < depth) {

             triangle(x+ wi/4, y, wi/2);

             // paint the triangle in center of given square
             // split to three squares pyramide
             // recursively paint each square of pyramide

             setTimeout(() => {

                  recstep(x, y, wi/2, de+1);
                  recstep(x+wi/2, y, wi/2, de+1);
                  recstep(x + wi/4, y + wi/2, wi/2, de+1);

                  }, timestep);
             }
        }

   triangle(0, 0, width, basecolor, true);
   recstep(0, 0, width, 0);

Построение на C#

Построение на C# в консоли с помощью треугольника Паскаля:

using System;

namespace Serpinski 
{ 
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Power of 2: ");
            int depth = Convert.ToInt32(Math.Pow(2d, Convert.ToDouble(Console.ReadLine())));

            int[][] pascaltriangle = new int[depth][];
            for (int i = 0; i < pascaltriangle.Length; i++)
            {
                pascaltriangle[i] = new int[depth];
                for (int j = 0; j < pascaltriangle[i].Length; j++)
                    pascaltriangle[i][j] = 0;
                pascaltriangle[i][0] = 1;
                pascaltriangle[i][i] = 1;
            }

            for (int i = 1; i < pascaltriangle.Length; i++)
                for (int j = 1; j < pascaltriangle[i].Length; j++)
                    pascaltriangle[i][j] = (pascaltriangle[i - 1][j - 1] + pascaltriangle[i - 1][j]) % 2;

            for (int i = 0; i < pascaltriangle.Length; i++)
            {
                for (int j = 0; j < pascaltriangle[i].Length; j++)
                    Console.Write(pascaltriangle[i][j] == 1 ? "#" : " ");
                Console.WriteLine();
            }
            
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }
}
Remove ads

Галерея

См. также

Примечания

Литература

Ссылки

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads