January 26, 2023

OneLiner для множества Мандельброта

Множество Мандельброта - наиболее известное фрактальное множество точек плоскости. Для всех таких точек комплЕксная последовательность z0 = (0,0), z_n = z^2 + c является ограниченной последовательностью.

Мощная стандартная библиотека PascalABC.NET позволяет написать рисование множества Мандельброта в одну строку:

##
uses GraphWPF;
DrawPixels(0,0,MatrGen(800,600,
  (ix,iy)->GrayColor(255-SeqWhile(Cplx(0,0),
  z -> z * z + 0.0035 * Cplx(ix - 600,iy - 300), 
  z -> z.Magnitude<10).Take(255).Count)));

При запуске программы получим вот такое изображение:

Здесь используется процедура DrawPixels, рисующая двумерный массив цветов пикселей, генератор последовательности SeqWhile, формирующий последовательность с неизвестной длиной, определяемой условием завершения, а также комплексные числа с функцией Cplx создания комплексного числа.

Отметим, что в данном решении в функциональном стиле присутствуют как проблемы восприятия (код выглядит сложным), так и чисто технические проблемы реализации в одну строку, которые отсутствуют при реализации алгоритмом - это реализация цикла с выходом по break с помощью комбинации SeqWhile и Take.

Более спокойное и понятное решение циклами приводится ниже:

##
uses GraphWPF;
var m := new Color[800,600];  
for var ix := 0 to 800 - 1 do
for var iy := 0 to 600 - 1 do
begin
  var z := Cplx(0,0);
  var n := 255;
  for var i:=0 to 255 do
  begin
    z := z * z + 0.0035 * Cplx(ix - 600,iy - 300);
    if z.Magnitude > 10 then
    begin  
      n := i;
      break;
    end;  
  end;
  m[ix,iy] := GrayColor(255-n);
end;
DrawPixels(0,0,m);