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 abI
– Edit; 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