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);