Kazimierz Kwiatkowski

 

Dywan Mandelbrota*

 

            Programować może każdy - zachęcają podręczniki programowania we wszystkich językach świata. Żeby jednak napisać program, który robi coś ciekawego i sensownego, trzeba przeczytać dziesiątki, a może nawet setki stron książek pisanych przez specjalistów. Przygotowałem instrukcję, jak zrobić coś ciekawego w systemie Borland Builder C++. Korzystam z płytki CD z miesięcznika ENTER, wersja Buildera 3.0 Standard, którą udało mi się kiedyś zainstalować, i która działa. Oczywiście może być dowolna wersja Buildera.

 

Zatem do dzieła!

 

1. Włączamy komputer i instalujemy system Builder C++.

 

2. Uruchamiamy (?),

 

Słownik PWN:

uruchomić dk VIa, ~mię, ~misz, ~om, ~mił, ~miony 

uruchamiać, rzad. uruchomiać ndk I, ~am, ~asz, ~ają, ~aj, ~ał, ~any

 

tak, uruchamiamy Buildera.

 

3. Wybieramy z menu File  ð Save Project As...,

            otwiera się okno Save Unit1 As.

 

4. Wybieramy przycisk Utwórz nowy folder, zmieniamy jego nazwę Nowy folder na Mandelbrot i otwieramy utworzony folder.

 

5. Nazwę pliku Unit1 zmieniamy na uMandelbrot - Zapisz; nazwę Project1 na Mandelbrot - Zapisz.

 

Jesteśmy gotowi do programowania…

 

1. Na pasku Standard wybieramy przycisk abIEdit; na formularzu - Form1 – umieszczamy okienko z napisem Edit1.

 

2. W oknie Object Inspektor - w polu Test - wpisujemy liczbę „1024” – jest to istotny parametr naszego programu.

 

W podobny sposób tworzymy okienka Edit2, Edit3 i Edit4, do których wpisujemy liczby:  1”,  0,0” i „0,0”. Tak!, tak!,… zero przecinek zero. Będzie  dobrze, jeżeli wszystkie parametry wpiszemy z klawiatury numerycznej. Cztery liczby: 1024, 1, 0,0 i 0,0 - to dane początkowe naszego programu, które później będziemy zmieniali, ale szczegóły zostawmy na koniec!

 

Wracamy na pasek Standard - wybieramy przycisk OK - Button, umieszczamy go na formularzu - Form1 i w oknie Object Inspektor - w polu Caption - wpisujemy słowo Run, żeby wyglądało poważniej. Oczywiście może być - Rysuj! W polu Default możemy wpisać (lub wybrać) true. To sprawi, że przycisk Run będzie domyślny i program będzie uruchamiał (a właśnie!) się po wciśnięciu klawisza Enter. Podobnie dorabiamy przycisk z napisem End lub Koniec, już bez wpisu true. Rozwijamy okno Form1 na cały ekran - Maksymalizuj - i ustawiamy pola Edit1, 2, 3, 4 i przyciski Button1, 2 obok siebie na dole formularza.

 

Jeszcze tylko parę linii kodu w języku C++ i koniec programowania!

 

1. Dwukrotne kliknięcie przycisku z napisem End (Koniec) otwiera okno edytora, gdzie w miejscu kursora robimy trzy spacje i piszemy Close();.

 

//----------------------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

   Close();

}

//----------------------------------------------------------------------------------------

UWAGA! W razie kłopotów, związanych z przechodzeniem z okna edytora do okna formularza, pamiętać należy o przyciskach na górnym pasku okna: (Minimalizuj/Przywróć, Maksymalizuj/Przywróć).

 

2. Dwukrotne kliknięcie przycisku z napisem Run (Rysuj) otwiera okno edytora, gdzie wpisujemy nieco więcej:

 

//----------------------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

  long x, y, d = Edit1 -> Text.ToInt();

  long double factor = Edit2 -> Text.ToDouble(),

       X0 = Edit3 -> Text.ToDouble(),

       Y0 = Edit4 -> Text.ToDouble(),

       MaxX = ClientWidth,

       MaxY = ClientHeight - Panel1 -> Height,

       halfMaxX = MaxX / 2,

       halfMaxY = MaxY / 2,

       unit = MaxX / 4 * factor,

       X, Y,

       p, q,

       tmp;

  long i, kolor;

  for (x = 0; x < MaxX; x++) Canvas -> Pixels[x][MaxY / 2] = clBlack;

  for (x = 0; x < MaxX; x++)

      for (y = 0; y < MaxY; y++)

      {

        X = (x - halfMaxX) / unit + X0;

        Y = (halfMaxY - y) / unit + Y0;

        p = X; q = Y;

        for (i = 0; i < d; i++)

        {

           tmp = p*p - q*q + X;

           q = 2.0*p*q + Y;

           p = tmp;

           if (p*p + q*q > 4) break;

        }

        if (i == d) kolor = RGB(0, 0, 0);

        else kolor = RGB(31+8192*i/d, 63+4096*i/d, 127+2048*i/d);

        Canvas -> Pixels[x][y] = TColor(kolor);

        Canvas -> Pixels[halfMaxX][y] = clBlue;

        Canvas -> Pixels[x][halfMaxY] = clBlue;

      }

}

//----------------------------------------------------------------------------------------

3. Teraz wystarczy nacisnąć klawisz F9 i czekać. Jeżeli wszystko poszło  dobrze i ukazało się okno aplikacji, należy rozwinąć okno na pełny ekran i nacisnąć klawisz Enter lub przycisk Run (Rysuj).

 

Pozostał nam jeszcze opis parametrów i wybranych zestawów wartości, dla których dzieje się coś ciekawego:

 

d             factor        X0                               Y0

liczba iteracji                powiększenie

 

256                             250                             -0,043                         0,986

256                             20.000                        -1,985468                   0,0

2.048                          1.000.000                   -1,785898                   0,0003335

4.096                          100.000.000               -1,98552634               0,0000011099

4.096                          250.000.000               -1,98552621               0,000001066

 

UWAGA! Jednostka początkowa jest równa ¼ szerokości formularza, zatem na ekranie, po uruchomieniu aplikacji, mamy obraz płaszczyzny z zakresów: od -2,0 do 2,0 w poziomie i od -1,3 do 1,3 - w pionie.

 

To jest dopiero początek zabawy. Zmieniając opisane parametry uzyskamy obrazy o niezwykłych kolorach i kształtach. Zapraszam w podróż po dywanie Mandelbrota i mam nadzieję, że zachęci to czytelników do dalszej, pogłębionej nauki programowania.

 

------------------------------------------------------------------------------------------------------------------------

* Don’tReadme.txt

------------------------------------------------------------------------------------------------------------------------

   Benoit B. Mandelbrot przeprowadził w roku 1979 eksperyment komputerowy, w którym badał przekształcenia punktów (x, y) płaszczyzny R2 opisane wzorami:

 

            1. (x, y) ð (x1, y1) = (x, y)2  +  (x, y),

            2. (xn, yn) ð (xn+1, yn+1) = (xn, yn) 2  +  (x, y), gdzie (x, y) Î R2 oraz n Î N.

 

   Ponieważ  (xn+1, yn+1) = (xn, yn) 2  +  (x, y) = (xn*xn - yn*yn  + x, 2*xn* yn  +  y),

więc rn+12 = xn+12 + yn+12, jest kwadratem odległości punktu, uzyskanego w n+1 przekształceniu, od początku układu współrzędnych. Jeżeli po n+1 iteracjach obraz punktu (x, y) ucieknie na odległość większą niż dwa od punktu (0, 0), to gdy n dąży do nieskończoności, obraz też dąży do nieskończoności; powiemy wtedy, że punkt (x, y) nie należy do zbioru Mandelbrota i malujemy jego obraz na ekranie w kolorze, który jest funkcją zależną od liczby iteracji użytej do testowania. Jeżeli zadana liczba powtórzeń nie wykaże, że obraz punktu (x, y) ucieka do nieskończoności, malujemy jego obraz na ekranie na czarno. Zwiększając liczbę iteracji otrzymujemy coraz dokładniejszy obraz zbioru Mandelbrota - kolor czarny. Obraz kolorowy - 224 kolorów - to obraz obszaru, który do zbioru Mandelbrota nie należy. Dywan Mandelbrota jest więc częścią dopełnienia zbioru Mandelbrota.

 


e-mail: kbkwiatkowski@wp.pl