Листинг 9.7. Оценка времени жизни

int dwell(double ex. double су) {

// return true dwell or Num, whichever is smaller // возвращаем меньшую из величин: // истинное время жизни или Num

#define Num 100 // increase this for better pictures // увеличиваем его для улучшения изображений

double tmp. dx - ex. dy - cy, fsq - cx * cx + су * cy:

for(int count - 0: count <- Num && fsq <- 4; count++)
{
tmp - dx;
// save old real part

// сохраняем старую вещественную часть

dx - dx * dx - dy * dy + cx: // new real part // новая вещественная часть

dy - 2.0 * tmp * dy + cy: // new imag. part // новая мнимая часть

fsq - dx * dx + dy* dy;
}

return count: // number of iterations used // число использованных итераций }

9.6. Множество Мандельброта Инкапсулируем эти вычисления в подпрограмму dwell О, приведенную в листинге 9.7. Для заданного значения с = сх + ci эта подпрограмма возвращает число итераций, достаточное для того, чтобы \dk\ превзошло 2, или само значение Num., если после Num итераций число 2 не было превзойдено. Для удобства сделано так, что подпрограмма dwell О сама определяет тип данных своего параметра.

При каждой итерации текущее значение dk хранится в виде пары (dx, dy), которая возводится в квадрат согласно равенству (9.14) и затем прибавляется к паре (сх, су), образуя тем самым следующее значение dk. Затем |й^|2 записывается в fsq и сравнивается с 4. Такое сравнение эквивалентно сравнению Щ с 2, и в то же время не нужно вычислять квадратный корень.

Функция dwell () играет ключевую роль при рисовании множества Мандельброта.

9.6.4. Рисование множества Мандельброта Предположим, что мы хотим отобразить множество M на растровом дисплее. Для того чтобы сделать это, мы задаем соответствие между каждым пикселом на дисплее и значением с и находим для этого с время жизни. Каждому пикселу присваивается цвет в зависимости от того, конечно ли это время жизни или оно достигло своего предела.

В простейших изображениях множества Мандельброта M точкам, находящимся внутри M (там, где время жизни достигло своего максимума), присваивается черный цвет, а точкам, находящимся вне M (где время жизни меньше максимального значения) - белый цвет. Однако изображения становятся намного приятнее для глаза, если с точками вне множества M связан целый диапазон цветов. Все эти точки обладают временем жизни меньше максимума, и им можно присвоить различные цвета в зависимости от длительности времени их жизни. Можно, например, присвоить ярко-желтый цвет точкам, которые находятся сразу за границей множества М, и более темный желтый для тех, которые дальше от границы М. Это сделает границу M очень четкой и яркой. На рис. 9.42 показано, как можно назначить цвет точке, имеющей время жизни d. Для очень малых значений d используется только темно-синяя составляющая. По мере достижения величиной d значения Num красного и зеленого компонентов (совместно образующие желтый цвет) возрастают до максимального единичного значения. Это можно реализовать в OpenGL следующим образом:


⇐ Предыдущая| |Следующая ⇒