Przeczytaj
Napisz program, którego zadaniem będzie wygenerowanie smoka Heighwaya w trybie tekstowym.
Specyfikacja problemu:
Dane:
tablica– tablica napisówH– łańcuch znaków; pozioma kreskaW– łańcuch znaków; pionowa kreskaL1– łańcuch znaków; skręt w prawo od dołuL2– łańcuch znaków; skręt w lewo od dołuL3– łańcuch znaków; skręt w lewo od góryL4– łańcuch znaków; skręt w prawo od góryx,y– liczby naturalnekierunek– łańcuch znaków
Wynik:
Program wyświetla wygenerowany fraktal (smoka Heighwaya).
Porównaj swoje rozwiązanie z przedstawionym w filmie.

Film dostępny pod adresem /preview/resource/Rqp1c9HFVopcG
Film nawiązujący do treści materiału: Konstrukcje fraktalne jako stosowanie rekurencji 2.
Kod programu zaprezentowanego w filmie:
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ę.

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.

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

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.

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.

W tym momencie uruchomi się proces instalacji. Po jego zakończeniu możemy uruchomić edytor graficzny Qt Creator. Domyślnie IDEIDE 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.

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:

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:

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:
Plik Źródła/mainwindow.cpp powinien zawierać:
Oraz ostatni plik – Źródła/main.cpp:
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:
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:
Najpierw utworzymy punkt początkowy, od którego rozpoczniemy przekształcenia przy użyciu funkcji IFSIFS. 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:
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:
Zastanówmy się, w jaki sposób możemy wygenerować losową liczbę całkowitą z przedziału . 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:
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.
Ostatnim krokiem będzie dodanie w pętli linijki, która wyśle utworzony punkt do narysowania.
Całość kodu prezentuje się zatem następująco:
Uruchomienie tak napisanego programu spowoduje wyświetlenie następującego okna:

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

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:
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:
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 :
Natomiast część warunkową, która odpowiada za funkcje IFS, zmodyfikujemy do następującej postaci:
Ostateczny program będzie zatem wyglądał tak:
A oto rezultat uruchomienia tego programu z parametrem n = 10000:

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

Słownik
(od ang. integrated development environment) zintegrowane środowisko programistyczne; oprogramowanie służące do tworzenia oraz modyfikowania projektów programistycznych
(z ang. iterated function system) systemem funkcji iterowanych; rodzina funkcji służących do generowania fraktali