Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Фрактал   Slava Arharov   20 May 2001 22:29:49 
 Фрактал   Aleksey Malov   22 May 2001 21:31:26 
 Фрактал   Dan Raskovalov   22 May 2001 00:51:44 
 Фрактал   Andrey Paniukov   24 May 2001 22:54:33 
 Re: Фрактал   Michael Ryazanov   21 May 2001 21:40:00 
Архивное /ru.algorithms/2767036f8a0e.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional