|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Aleksey Malov 2:5052/30.8 22 May 2001 21:31:26 To : Slava Arharov Subject : Фрактал --------------------------------------------------------------------------------
Sun 20 May 2001, at 22:29:49 Slava Arharov told All about Фрактал.
SA> Может уже избито, но не подскажет ли мне олл _HОРМАЛЪHЫЙ_ и _РАБОТАЮЩИЙ_
SA> алгоритм сабжа Манделъброта ? Какие-то сабжи я уже строитъ научился, но
SA> этот... Hикак не получится, хотъ ты тресни...Можно исходник, толъко
Цвет точки с координатами C(X,Y) на комплексной плоскости определяется по
следующему алгоритму:
#define MaxCount 1000 // макс. число циклов расчета (уровень детализации)
#define Infinity 1e300 // значение "бесконечность"
char GetPointColor(Complex C)
{
Complex Z(0,0); //начальное значение комплексной переменной
int Count = MaxCount; //максимальное число циклов
do
{
Z = Z*Z + C; //самое главное (***)
Count --; //уменьшаем значение счетчика
} while (((Z.Re*Z.Re + Z.Im*Z.Im) < Infinity)&&Count);
//если квадрат модуля нашей комплексной переменной не достиг
//"бесконечности" и не обнулился счетчик, повторяем цикл
return (char)Count; //возвращаем значение цвета точки (0..255)
}
Обрати внимание, что в строке (***) выполняются вычисления над комплексными
числами.
Данную строку можно записать также в виде:
double r,i;
r = Z.Re*Z.Re - Z.Im*Z.Im + C.Re;
i = 2*Z.Re*Z.Im + C.Im;
Z.Re = r;
Z.Im = i;
Самая интересная часть фрактала располагается в пределах (-2,2) по X и Y.
Для построения фрактала делаешь следующее:
#define ScrWidth 320
#define ScrHeight 200
void Mandelbrot(double Xa, double Xb, double Ya, double Yb)
{
double StepX = (Xb-Xa)/ScrWidth; //шаг по X
double StepY = (Yb-Ya)/ScrHeight; //шаг по Y
Complex C; //координаты точки в компл. плоскости
C.Im = Ya; //нач. коорд. Y
for (int y = 0; y<ScrHeight; y++) //цикл по экранным строкам
{
C.Re = Xa; // нач. коорд. X
for (int x = 0; x<ScrWidth; x++) //цикл по экранным столбцам
{
putpixel (x, y, GetPointColor (C); //вывод точки на экран цветом, зависящим
//от C
C.Re += StepX; //смещаемся в плоскости по X
}
C.Im += StepY; //смещаемся в плоскости по Y
}
}
Для тестирования можешь вызвать:
Mandelbrot ( -2, 2, -1.5, 1.5 );
Процедура putpixel( int X, int Y, char Color) выводит точку в координаты (X,Y)
цветом Color (палитру задай сам, наприеер плавные переходы разных градаций).
Класс комплексных чисел выглядит например так:
class Complex
{
public:
double Im;
double Re;
Complex ();
Complex (double r, double i);
Complex operator=(Complex c)
{
Re = c.Re;
Im = c.Im;
return *this;
}
Complex operator+(Complex c);
{
return Complex (Re + c.Re, Im + c.Im);
}
Complex operator*(Complex c)
{
return Complex ( Re*c.Re - Im*c.Im, Re*c.Im + Im*c.Re);
}
};
Complex::Complex ()
{
Re = Im = 0;
}
Complex::Complex (double r, double i)
{
Re = r;
Im = i;
}
Bye, Slava.
WBR, Vivid^Brainwave of the X-Project association.
--- Lara Croft за 4.50 $.
* Origin: http://www.brainwave.dax.ru (2:5052/30.8)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/2767036f8a0e.html, оценка из 5, голосов 10
|