📖 Документация Qumir

← Вернуться в Playground

← Все примеры

Цветной мандельброт

Классическое множество Мандельброта, где каждая точка раскрашена по числу итераций до выхода из круга радиуса 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
кон

▶ Запустить пример