Цветной мандельброт
Классическое множество Мандельброта, где каждая точка раскрашена по числу итераций до выхода из круга радиуса 2. Точки множества остаются чёрными.
Разбор
Множество Мандельброта
Для каждой точки $c = (c_{re}, c_{im})$ комплексной плоскости выполняется итерация:
$z_{n+1} = z_n^2 + c, \quad z_0 = 0$
Если $|z_n| > 2$ на шаге $n$, точка не принадлежит множеству. Число итераций $n$ используется для выбора цвета.
Раскраска
если it < maxIter то
пиксель(px, py, HSL(it * 360 / maxIter, 100, 50))
все
Число итераций it отображается на оттенок 0°–360°. Точки множества (итерации не завершились) остаются чёрными (цвет фона листа).
Функция итераций
алг цел итерации(вещ cre, вещ cim, цел maxIter)
нач
вещ zr, zi, zr2, zi2, tmp
...
нц пока iter < maxIter и zr2 + zi2 <= 4.0
tmp := zr2 - zi2 + cre
zi := 2.0 * zr * zi + cim
zr := tmp
zr2 := zr * zr
zi2 := zi * zi
iter := iter + 1
кц
знач := iter
кон
Хранятся квадраты zr2 = zr*zr и zi2 = zi*zi — это позволяет не вычислять квадраты дважды. Условие zr2 + zi2 <= 4.0 проверяет $|z|^2 \le 4$, то есть $|z| \le 2$.
Масштаб
Лист 320×240, область комплексной плоскости $[-2{,}5; 1{,}0] \times [-1{,}2; 1{,}2]$ — стандартный вид множества Мандельброта. Шаг по пикселю: dx = (maxX - minX) / w.
Полная программа
| Цветной мандельброт: каждая точка раскрашивается через HSL
| по числу итераций до выхода из круга радиуса 2.
| Точки множества (не вышедшие) остаются чёрными.
использовать Рисователь
алг
нач
цел w, h, maxIter
w := 320
h := 240
maxIter := 100
новый лист(w, h, чёрный)
цел px, py, it
вещ cx, cy, dx, dy
вещ minX, maxX, minY, maxY
minX := -2.5
maxX := 1.0
minY := -1.2
maxY := 1.2
dx := (maxX - minX) / w
dy := (maxY - minY) / h
нц для py от 0 до h - 1
cy := minY + py * dy
нц для px от 0 до w - 1
cx := minX + px * dx
it := итерации(cx, cy, maxIter)
если it < maxIter то
пиксель(px, py, HSL(it * 360 / maxIter, 100, 50))
все
кц
кц
кон
| Возвращает число итераций до |z|>2, не более maxIter
алг цел итерации(вещ cre, вещ cim, цел maxIter)
нач
вещ zr, zi, zr2, zi2, tmp
цел iter
zr := 0.0
zi := 0.0
zr2 := 0.0
zi2 := 0.0
iter := 0
нц пока iter < maxIter и zr2 + zi2 <= 4.0
tmp := zr2 - zi2 + cre
zi := 2.0 * zr * zi + cim
zr := tmp
zr2 := zr * zr
zi2 := zi * zi
iter := iter + 1
кц
знач := iter
кон