Problem 1

Napisz program, którego zadaniem będzie wygenerowanie smoka Heighwaya w trybie tekstowym.

Specyfikacja problemu:

Dane:

  • tablica – tablica napisów

  • H – łańcuch znaków; pozioma kreska

  • W – łańcuch znaków; pionowa kreska

  • L1 – łańcuch znaków; skręt w prawo od dołu

  • L2 – łańcuch znaków; skręt w lewo od dołu

  • L3 – łańcuch znaków; skręt w lewo od góry

  • L4 – łańcuch znaków; skręt w prawo od góry

  • x, y – liczby naturalne

  • kierunek – łańcuch znaków

Wynik:

Program wyświetla wygenerowany fraktal (smoka Heighwaya).

R8hDXgjH17Chs
Wybierz jedno nowe słowo poznane podczas dzisiejszej lekcji i ułóż z nim zdanie.
Polecenie 1

Porównaj swoje rozwiązanie z przedstawionym w filmie.

Rqp1c9HFVopcG
Film nawiązujący do treści materiału: Konstrukcje fraktalne jako stosowanie rekurencji 2.

Kod programu zaprezentowanego w filmie:

RNbCS00XR9HWa

Przycisk do pobrania pliku CCP z kodem źródłowym z filmu.

Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Plik CPP o rozmiarze 2.51 KB w języku polskim

Biblioteka graficzna Qt5 – konfiguracja środowiska

W zaprezentowanym filmie wygenerowaliśmy smoka Heighwaya w trybie tekstowym. W kolejnym kroku, aby dokonać wizualizacji wyników obliczeń naszego programu, posłużymy się biblioteką graficzną Qt5. Zaletą tego rozwiązania jest prostota konfiguracji.

W celu uruchomienia środowiska należy pobrać instalator z oficjalnej strony Qt. Znajdziemy ją, wpisując do dowolnej przeglądarki internetowej frazę „qt5” – jednym z pierwszych wyników, które się wyświetlą, będzie właśnie szukana strona internetowa.

Po uruchomieniu instalatora zostaniemy poproszeni o zalogowanie się. Jeśli nie mamy konta, możemy je utworzyć bezpośrednio z poziomu instalatora. W tym celu należy wybierać opcję Sign up (zarejestruj się), zarejestrować konto, a następnie potwierdzić je za pomocą adresu e‑mail. Po poprawnym utworzeniu konta wystarczy zalogować się w instalatorze i można kontynuować instalację.

R1CpeRRnpEo4j1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W kolejnym etapie należy zaakceptować zobowiązania licencyjne, a także podać nazwę firmy/imię biznesowe lub wybrać opcję I am individual person not using Qt for any company, która zapewne będzie dotyczyć znacznej większości użytkowników. Kontynuujemy instalację, wybierając opcję Next.

R1coj7I3vHFUv1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Następnie możemy zdecydować, czy chcemy przesłać dodatkowe dane w celu ulepszenia przyszłych wersji Qt5. Zaznaczamy wybraną opcję i kontynuujemy instalację.

RENkk33AaUxAS1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W kolejnym kroku podajemy lokalizację, w której umieszczone zostaną pliki programu. W przypadku początkujących użytkowników zaleca się wybranie domyślnej opcji Default desktop installation, aby wraz ze środowiskiem został zainstalowany kompilator oraz edytor graficzny. Następnie wybieramy opcję Next.

R1AMAylMERjsq1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Teraz należy zapoznać się z postanowieniami licencyjnymi środowiska oraz produktów wraz z nim dołączonych i zaakceptować je, a następnie wybrać Next. W kolejnym etapie można ewentualnie zmienić nazwę grupy, która zostanie utworzona w menu Start, po czym ponownie wybrać Next.

R1IqEurueH0SG1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W tym momencie uruchomi się proces instalacji. Po jego zakończeniu możemy uruchomić edytor graficzny Qt Creator. Domyślnie IDEIDEIDE wykryje język systemu operacyjnego. W przypadku, gdybyśmy chcieli zmienić język z angielskiego na polski, można to zrobić, wybierając:Tools/Options.../Environment/Interface/Language. Wówczas wybieramy z listy interesujący nas język i potwierdzamy wybór opcją OK, a następnie Restart now.

Pierwsza rzecz, jaką trzeba zrobić, aby zbudować przykładowy program, to utworzenie nowego projektu z menu Plik. Wybieramy opcję Nowy plik lub projekt, a dalej – szablon Application (Qt) oraz Qt Widgets Application.

R9f6fULt5w7nT1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Następnie należy wprowadzić nazwę projektu oraz wybrać katalog, w którym chcemy go zapisać. W następnych oknach zalecany jest wybór domyślnych opcji aż do momentu, w którym będziemy mogli wybrać Zakończ. Po utworzeniu projektu według powyższych zaleceń ukaże się nam następująca struktura plików programu:

RkRSh4sUg2mEJ1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Tak utworzony program możemy uruchomić, wybierając opcję Uruchom (zielony trójkąt w lewym dolnym rogu). Po poprawnym wykonaniu tej czynności na ekranie ukaże się następujący program:

RlpCT9DaVwiqg1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Ponieważ tematem tego e‑materiału nie jest bezpośrednio obsługa biblioteki graficznej Qt5 ani związana z nią obiektowość, dalej będziemy korzystać z szablonu napisanego specjalnie na potrzeby rysowania punktów na ekranie. W szablonie zawarta jest metoda drawPoint(double x, double y) obiektu MainWindow, która pozwoli nam narysować w powyższym oknie punkt na określonej pozycji. Ponieważ piksele w programie numerowane są od zera oraz w stronę przeciwną na osi OY niż w układzie współrzędnych, szablon zawiera przekształcenia, które pozwolą nam traktować przestrzeń programu jak układ kartezjański o skali dobranej do tworzonego fraktala.

Smok Heighwaya

Przed przystąpieniem do omówienia procedury generowania konstrukcji smoka Heighwaya przygotujmy strukturę programu.

W pliku Nagłówki/mainwindow.h należy umieścić następujący kod:

Linia 1. kratka ifndef MAINWINDOW podkreślnik H. Linia 2. kratka define MAINWINDOW podkreślnik H. Linia 4. kratka include otwórz nawias ostrokątny QMainWindow zamknij nawias ostrokątny. Linia 5. kratka include otwórz nawias ostrokątny list zamknij nawias ostrokątny. Linia 7. using namespace std średnik. Linia 9. QT podkreślnik BEGIN podkreślnik NAMESPACE. Linia 10. namespace Ui otwórz nawias klamrowy class MainWindow średnik zamknij nawias klamrowy. Linia 11. QT podkreślnik END podkreślnik NAMESPACE. Linia 13. class MainWindow dwukropek public QMainWindow. Linia 14. otwórz nawias klamrowy. Linia 15. Q podkreślnik OBJECT. Linia 17. public dwukropek. Linia 18. MainWindow otwórz nawias okrągły QWidget asterysk parent znak równości nullptr zamknij nawias okrągły średnik. Linia 19. tylda MainWindow otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 21. virtual void paintEvent otwórz nawias okrągły QPaintEvent asterysk event zamknij nawias okrągły override średnik. Linia 22. void drawPoint otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły średnik. Linia 24. private dwukropek. Linia 25. Ui dwukropek dwukropek MainWindow asterysk ui średnik. Linia 26. list otwórz nawias ostrokątny QPoint zamknij nawias ostrokątny points średnik. Linia 27. zamknij nawias klamrowy średnik. Linia 28. kratka endif prawy ukośnik prawy ukośnik MAINWINDOW podkreślnik H.

Plik Źródła/mainwindow.cpp powinien zawierać:

Linia 1. kratka include cudzysłów mainwindow kropka h cudzysłów. Linia 2. kratka include cudzysłów ui podkreślnik mainwindow kropka h cudzysłów. Linia 3. kratka include cudzysłów qpainter kropka h cudzysłów. Linia 5. using namespace std średnik. Linia 7. MainWindow dwukropek dwukropek MainWindow otwórz nawias okrągły QWidget asterysk parent zamknij nawias okrągły. Linia 8. dwukropek QMainWindow otwórz nawias okrągły parent zamknij nawias okrągły. Linia 9. przecinek ui otwórz nawias okrągły new Ui dwukropek dwukropek MainWindow zamknij nawias okrągły. Linia 10. otwórz nawias klamrowy. Linia 11. ui minus zamknij nawias ostrokątny setupUi otwórz nawias okrągły this zamknij nawias okrągły średnik. Linia 12. this minus zamknij nawias ostrokątny setFixedSize otwórz nawias okrągły 700 przecinek 480 zamknij nawias okrągły średnik. Linia 13. this minus zamknij nawias ostrokątny setWindowTitle otwórz nawias okrągły cudzysłów Smok Heighwaya cudzysłów zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 16. MainWindow dwukropek dwukropek tylda MainWindow otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. delete ui średnik. Linia 18. zamknij nawias klamrowy. Linia 20. void MainWindow dwukropek dwukropek drawPoint otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 21. int new podkreślnik x znak równości x asterysk 400 kropka 0 plus 180 średnik. Linia 22. int new podkreślnik y znak równości 300 minus y asterysk 400 kropka 0 średnik. Linia 24. points kropka push podkreślnik back otwórz nawias okrągły QPoint otwórz nawias okrągły new podkreślnik x przecinek new podkreślnik y zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 27. void MainWindow dwukropek dwukropek paintEvent otwórz nawias okrągły QPaintEvent asterysk event zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. QPainter painter otwórz nawias okrągły this zamknij nawias okrągły średnik. Linia 30. for otwórz nawias okrągły auto ampersant point dwukropek points zamknij nawias okrągły otwórz nawias klamrowy. Linia 31. painter kropka drawPoint otwórz nawias okrągły point zamknij nawias okrągły średnik. Linia 32. zamknij nawias klamrowy. Linia 33. zamknij nawias klamrowy.

Oraz ostatni plik – Źródła/main.cpp:

Linia 1. kratka include cudzysłów mainwindow kropka h cudzysłów. Linia 3. kratka include otwórz nawias ostrokątny QApplication zamknij nawias ostrokątny. Linia 4. kratka include otwórz nawias ostrokątny cstdlib zamknij nawias ostrokątny. Linia 6. using namespace std średnik. Linia 8. int main otwórz nawias okrągły int argc przecinek char asterysk argv otwórz nawias kwadratowy zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 10. QApplication a otwórz nawias okrągły argc przecinek argv zamknij nawias okrągły średnik. Linia 11. MainWindow w średnik. Linia 13. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 15. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 17. prawy ukośnik prawy ukośnik Koniec programu minus wyświetlenie wyniku. Linia 18. w kropka show otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 19. return a kropka exec otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 20. zamknij nawias klamrowy.

W tym momencie w pliku main.cpp możemy pisać właściwy kod aplikacji, odpowiedzialny za generowanie fraktali. Aby narysować punkt na określonej pozycji, możemy skorzystać z linijki:

Linia 1. w kropka drawPoint otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik.

Na początku warto podjąć samodzielną próbę wygenerowania smoka Heighwaya, zgodnie z omówionym w poprzedniej lekcji algorytmem, którego pseudokod wygląda następująco:

Linia 1. prawy ukośnik prawy ukośnik punkt startowy. Linia 2. x znak równości 0 kropka 0. Linia 3. y znak równości 0 kropka 0. Linia 5. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 6. n znak równości 10000. Linia 8. wykonuj n razy dwukropek. Linia 9. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 10. x0 znak równości x. Linia 12. g znak równości losuj liczbę z otwórz nawias kwadratowy 0 przecinek 1 zamknij nawias kwadratowy. Linia 14. jeżeli g znak równości znak równości 0 wykonuj. Linia 15. x znak równości 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y. Linia 16. y znak równości 0 kropka 5 asterysk x0 plus 0 kropka 5 asterysk y. Linia 17. w przeciwnym wypadku. Linia 18. x znak równości minus 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y plus 1. Linia 19. y znak równości 0 kropka 5 asterysk x0 minus 0 kropka 5 asterysk y. Linia 21. rysuj punkt otwórz nawias okrągły x przecinek y zamknij nawias okrągły.

Najpierw utworzymy punkt początkowy, od którego rozpoczniemy przekształcenia przy użyciu funkcji IFSIFSIFS. Ponieważ punkt w układzie współrzędnych reprezentowany jest jako dwie liczby, utworzymy tylko dwie zmienne typu zmiennoprzecinkowego double o nazwach x oraz y, które będą stanowiły współrzędną x oraz y:

Linia 1. prawy ukośnik prawy ukośnik punkt startowy. Linia 2. double x znak równości 0 kropka 0 przecinek y znak równości 0 kropka 0 średnik.

Kolejnym krokiem jest zdefiniowanie liczby punktów n, których użyjemy do utworzenia fraktala. Następnie utworzymy pętlę, która wykona się n razy. W tym celu możemy wykorzystać zarówno pętlę while, jak i for. W naszym przypadku skorzystamy z drugiej opcji:

Linia 1. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 2. int n znak równości 10000 średnik. Linia 4. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. prawy ukośnik prawy ukośnik tworzenie kolejnych punktów. Linia 6. zamknij nawias klamrowy.

Zastanówmy się, w jaki sposób możemy wygenerować losową liczbę całkowitą z przedziału 0 , 1 . We wcześniejszych lekcjach poznaliśmy już sposób obsługi funkcji rand() z biblioteki <cstdlib>. Wiemy też, że można ograniczyć jej zakres działania przez operację dzielenia modulo. Do wyboru losowej liczby możemy zatem wykorzystać poniższy zapis:

Linia 1. prawy ukośnik prawy ukośnik losowa liczba całkowita z przedziału otwórz nawias ostrokątny 0 przecinek 1 zamknij nawias ostrokątny. Linia 2. int q znak równości rand otwórz nawias okrągły zamknij nawias okrągły procent 2 średnik.

Teraz możemy już przejść do modelowania funkcji IFS. Przed przystąpieniem do tej czynności należy jednak zrobić kopię zmiennej x, aby podczas generacji nowej wartości y nie wykorzystać nowej wartości x.

Linia 1. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 2. double x0 znak równości x średnik. Linia 4. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. x znak równości 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y średnik. Linia 6. y znak równości 0 kropka 5 asterysk x0 plus 0 kropka 5 asterysk y średnik. Linia 7. zamknij nawias klamrowy. Linia 8. else otwórz nawias klamrowy. Linia 9. x znak równości minus 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y plus 1 średnik. Linia 10. y znak równości 0 kropka 5 asterysk x0 minus 0 kropka 5 asterysk y średnik. Linia 11. zamknij nawias klamrowy.

Ostatnim krokiem będzie dodanie w pętli linijki, która wyśle utworzony punkt do narysowania.

Linia 1. prawy ukośnik prawy ukośnik Wysłanie punktu do narysowania. Linia 2. w kropka drawPoint otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik.

Całość kodu prezentuje się zatem następująco:

Linia 1. kratka include cudzysłów mainwindow kropka h cudzysłów. Linia 3. kratka include otwórz nawias ostrokątny QApplication zamknij nawias ostrokątny. Linia 4. kratka include otwórz nawias ostrokątny cstdlib zamknij nawias ostrokątny. Linia 6. using namespace std średnik. Linia 8. int main otwórz nawias okrągły int argc przecinek char asterysk argv otwórz nawias kwadratowy zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 10. QApplication a otwórz nawias okrągły argc przecinek argv zamknij nawias okrągły średnik. Linia 11. MainWindow w średnik. Linia 13. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 14. prawy ukośnik prawy ukośnik punkt startowy. Linia 15. double x znak równości 0 kropka 0 przecinek y znak równości 0 kropka 0 średnik. Linia 16. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 17. int n znak równości 10000 średnik. Linia 19. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 20. prawy ukośnik prawy ukośnik losowa liczba całkowita z przedziału otwórz nawias ostrokątny 0 przecinek 1 zamknij nawias ostrokątny. Linia 21. int q znak równości rand otwórz nawias okrągły zamknij nawias okrągły procent 2 średnik. Linia 23. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 24. double x0 znak równości x średnik. Linia 26. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 27. x znak równości 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y średnik. Linia 28. y znak równości 0 kropka 5 asterysk x0 plus 0 kropka 5 asterysk y średnik. Linia 29. zamknij nawias klamrowy. Linia 30. else otwórz nawias klamrowy. Linia 31. x znak równości minus 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y plus 1 średnik. Linia 32. y znak równości 0 kropka 5 asterysk x0 minus 0 kropka 5 asterysk y średnik. Linia 33. zamknij nawias klamrowy. Linia 35. prawy ukośnik prawy ukośnik Wysłanie punktu do narysowania. Linia 36. w kropka drawPoint otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 37. zamknij nawias klamrowy. Linia 39. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 41. prawy ukośnik prawy ukośnik Koniec programu minus wyświetlenie wyniku. Linia 42. w kropka show otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 43. return a kropka exec otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 44. zamknij nawias klamrowy.

Uruchomienie tak napisanego programu spowoduje wyświetlenie następującego okna:

RkViX3cLSB7jE1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Jak widzimy, warto zwiększyć liczbę generowanych punktów. Oto jak będzie wyglądał wynik programu dla parametru n = 1000000:

RwDx7Bsj5ZeKI1
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Paproć Barnsleya

Ponieważ skala wielkości kształtów smoka Heighwaya oraz paproci Barnsleya, a także ich pozycja w układzie współrzędnych jest różna, szablon w przypadku paproci musi zostać zmodyfikowany. Jedyny plik, który zmienimy w tym celu, to mainwindow.cpp – należy umieścić w nim następujący kod:

Linia 1. kratka include cudzysłów mainwindow kropka h cudzysłów. Linia 2. kratka include cudzysłów ui podkreślnik mainwindow kropka h cudzysłów. Linia 3. kratka include cudzysłów qpainter kropka h cudzysłów. Linia 5. MainWindow dwukropek dwukropek MainWindow otwórz nawias okrągły QWidget asterysk parent zamknij nawias okrągły. Linia 6. dwukropek QMainWindow otwórz nawias okrągły parent zamknij nawias okrągły. Linia 7. przecinek ui otwórz nawias okrągły new Ui dwukropek dwukropek MainWindow zamknij nawias okrągły. Linia 8. otwórz nawias klamrowy. Linia 9. ui minus zamknij nawias ostrokątny setupUi otwórz nawias okrągły this zamknij nawias okrągły średnik. Linia 10. this minus zamknij nawias ostrokątny setFixedSize otwórz nawias okrągły 380 przecinek 580 zamknij nawias okrągły średnik. Linia 11. this minus zamknij nawias ostrokątny setWindowTitle otwórz nawias okrągły cudzysłów Paproć Barnsleya cudzysłów zamknij nawias okrągły średnik. Linia 12. zamknij nawias klamrowy. Linia 14. MainWindow dwukropek dwukropek tylda MainWindow otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. delete ui średnik. Linia 16. zamknij nawias klamrowy. Linia 18. void MainWindow dwukropek dwukropek drawPoint otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 19. int new podkreślnik x znak równości x asterysk 50 kropka 0 plus 175 średnik. Linia 20. int new podkreślnik y znak równości 525 minus y asterysk 50 kropka 0 średnik. Linia 22. points kropka push podkreślnik back otwórz nawias okrągły QPoint otwórz nawias okrągły new podkreślnik x przecinek new podkreślnik y zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 23. zamknij nawias klamrowy. Linia 25. void MainWindow dwukropek dwukropek paintEvent otwórz nawias okrągły QPaintEvent asterysk event zamknij nawias okrągły otwórz nawias klamrowy. Linia 26. QPainter painter otwórz nawias okrągły this zamknij nawias okrągły średnik. Linia 28. for otwórz nawias okrągły auto ampersant point dwukropek points zamknij nawias okrągły otwórz nawias klamrowy. Linia 29. painter kropka drawPoint otwórz nawias okrągły point zamknij nawias okrągły średnik. Linia 30. zamknij nawias klamrowy. Linia 31. zamknij nawias klamrowy.

Jeżeli udało ci się wygenerować poprzedni fraktal, na pewno poradzisz sobie także z utworzeniem paproci Barnsleya. Algorytm zapisany za pomocą pseudokodu, który wtedy opracowaliśmy, prezentuje się następująco:

Linia 1. prawy ukośnik prawy ukośnik punkt startowy. Linia 2. x znak równości 0 kropka 0. Linia 3. y znak równości 0 kropka 0. Linia 5. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 6. n znak równości 10000. Linia 8. wykonuj n razy dwukropek. Linia 9. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 10. x0 znak równości x. Linia 12. g znak równości losuj liczbę z otwórz nawias kwadratowy 0 przecinek 1 przecinek kropka kropka kropka przecinek 99 zamknij nawias kwadratowy. Linia 14. jeżeli q otwórz nawias ostrokątny 1 wykonuj. Linia 15. x znak równości 0 średnik. Linia 16. y znak równości 0 kropka 16 asterysk y średnik. Linia 17. w przeciwnym wypadku jeżeli q otwórz nawias ostrokątny 86 wykonuj. Linia 18. x znak równości 0 kropka 85 asterysk x plus 0 kropka 04 asterysk y średnik. Linia 19. y znak równości minus 0 kropka 04 asterysk x0 plus 0 kropka 85 asterysk y plus 1 kropka 6 średnik. Linia 20. w przeciwnym wypadku jeżeli q otwórz nawias ostrokątny 93 wykonuj. Linia 21. x znak równości 0 kropka 2 asterysk x minus 0 kropka 26 asterysk y średnik. Linia 22. y znak równości 0 kropka 23 asterysk x0 plus 0 kropka 22 asterysk y plus 1 kropka 6 średnik. Linia 23. w przeciwnym wypadku. Linia 24. x znak równości minus 0 kropka 15 asterysk x plus 0 kropka 28 asterysk y średnik. Linia 25. y znak równości 0 kropka 26 asterysk x plus 0 kropka 24 asterysk y plus 0 kropka 44 średnik. Linia 27. rysuj punkt otwórz nawias okrągły x przecinek y zamknij nawias okrągły.

Różnica pomiędzy generacją paproci Barnsleya a generacją smoka Heighwaya polega tylko na zastosowaniu innych funkcji IFS w innych proporcjach. Linijka, która odpowiada za wygenerowanie losowej liczby, zostanie tu zmieniona w taki sposób, aby generować liczbę całkowitą z przedziału 0 , 99 :

Linia 1. prawy ukośnik prawy ukośnik losowa liczba całkowita z przedziału otwórz nawias ostrokątny 0 przecinek 99 zamknij nawias ostrokątny. Linia 2. int q znak równości rand otwórz nawias okrągły zamknij nawias okrągły procent 100 średnik.

Natomiast część warunkową, która odpowiada za funkcje IFS, zmodyfikujemy do następującej postaci:

Linia 1. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 2. double x0 znak równości x średnik. Linia 4. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. x znak równości 0 średnik. Linia 6. y znak równości 0 kropka 16 asterysk y średnik. Linia 7. zamknij nawias klamrowy. Linia 8. else if otwórz nawias okrągły q otwórz nawias ostrokątny 86 zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. x znak równości 0 kropka 85 asterysk x plus 0 kropka 04 asterysk y średnik. Linia 10. y znak równości minus 0 kropka 04 asterysk x0 plus 0 kropka 85 asterysk y plus 1 kropka 6 średnik. Linia 11. zamknij nawias klamrowy. Linia 12. else if otwórz nawias okrągły q otwórz nawias ostrokątny 93 zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. x znak równości 0 kropka 2 asterysk x minus 0 kropka 26 asterysk y średnik. Linia 14. y znak równości 0 kropka 23 asterysk x0 plus 0 kropka 22 asterysk y plus 1 kropka 6 średnik. Linia 15. zamknij nawias klamrowy. Linia 16. else otwórz nawias klamrowy. Linia 17. x znak równości minus 0 kropka 15 asterysk x plus 0 kropka 28 asterysk y średnik. Linia 18. y znak równości 0 kropka 26 asterysk x0 plus 0 kropka 24 asterysk y plus 0 kropka 44 średnik. Linia 19. zamknij nawias klamrowy.

Ostateczny program będzie zatem wyglądał tak:

Linia 1. kratka include cudzysłów mainwindow kropka h cudzysłów. Linia 3. kratka include otwórz nawias ostrokątny QApplication zamknij nawias ostrokątny. Linia 4. kratka include otwórz nawias ostrokątny cstdlib zamknij nawias ostrokątny. Linia 6. using namespace std średnik. Linia 8. int main otwórz nawias okrągły int argc przecinek char asterysk argv otwórz nawias kwadratowy zamknij nawias kwadratowy zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 10. QApplication a otwórz nawias okrągły argc przecinek argv zamknij nawias okrągły średnik. Linia 11. MainWindow w średnik. Linia 13. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 14. prawy ukośnik prawy ukośnik punkt startowy. Linia 15. double x znak równości 0 kropka 0 przecinek y znak równości 0 kropka 0 średnik. Linia 16. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 17. int n znak równości 10000 średnik. Linia 19. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n średnik plus plus i zamknij nawias okrągły otwórz nawias klamrowy. Linia 20. prawy ukośnik prawy ukośnik losowa liczba całkowita z przedziału otwórz nawias ostrokątny 0 przecinek 99 zamknij nawias ostrokątny. Linia 21. int q znak równości rand otwórz nawias okrągły zamknij nawias okrągły procent 100 średnik. Linia 23. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 24. double x0 znak równości x średnik. Linia 26. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 27. x znak równości 0 średnik. Linia 28. y znak równości 0 kropka 16 asterysk y średnik. Linia 29. zamknij nawias klamrowy. Linia 30. else if otwórz nawias okrągły q otwórz nawias ostrokątny 86 zamknij nawias okrągły otwórz nawias klamrowy. Linia 31. x znak równości 0 kropka 85 asterysk x plus 0 kropka 04 asterysk y średnik. Linia 32. y znak równości minus 0 kropka 04 asterysk x0 plus 0 kropka 85 asterysk y plus 1 kropka 6 średnik. Linia 33. zamknij nawias klamrowy. Linia 34. else if otwórz nawias okrągły q otwórz nawias ostrokątny 93 zamknij nawias okrągły otwórz nawias klamrowy. Linia 35. x znak równości 0 kropka 2 asterysk x minus 0 kropka 26 asterysk y średnik. Linia 36. y znak równości 0 kropka 23 asterysk x0 plus 0 kropka 22 asterysk y plus 1 kropka 6 średnik. Linia 37. zamknij nawias klamrowy. Linia 38. else otwórz nawias klamrowy. Linia 39. x znak równości minus 0 kropka 15 asterysk x plus 0 kropka 28 asterysk y średnik. Linia 40. y znak równości 0 kropka 26 asterysk x0 plus 0 kropka 24 asterysk y plus 0 kropka 44 średnik. Linia 41. zamknij nawias klamrowy. Linia 43. prawy ukośnik prawy ukośnik Wysłanie punktu do narysowania. Linia 44. w kropka drawPoint otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 45. zamknij nawias klamrowy. Linia 47. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 49. prawy ukośnik prawy ukośnik Koniec programu minus wyświetlenie wyniku. Linia 50. w kropka show otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 51. return a kropka exec otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 52. zamknij nawias klamrowy.

A oto rezultat uruchomienia tego programu z parametrem n = 10000:

R1XPY8wU20PiX
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Warto znów dopasować liczbę wygenerowanych punktów. Oto wynik programu uruchomionego z parametrem n = 1000000:

RGkyIiLV2lIhU
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Słownik

IDE
IDE

(od ang. integrated development environment) zintegrowane środowisko programistyczne; oprogramowanie służące do tworzenia oraz modyfikowania projektów programistycznych

IFS
IFS

(z ang. iterated function system) systemem funkcji iterowanych; rodzina funkcji służących do generowania fraktali