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.
![](https://static.zpe.gov.pl/portal/f/res-minimized/Rqp1c9HFVopcG/1689529063/1niPfnA4oshKN2JQvnPjCtaidkp3pNhx.jpg)
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ę.
![Zrzut ekranu przedstawia instalator Qt. krok pierwszy Welcome. W oknie znajdują się trzy pola do wypełnienia: email, hasło , oraz powtórzone hasło. Poniżej znajduje się checkbox świadczący dowód o przeczytaniu warunków. Okno to posiada takie przyciski jak: Settings, next i cancel.](https://static.zpe.gov.pl/portal/f/res-minimized/R1CpeRRnpEo4j/1665413871/1aDNvDkzc4duXzHi429SWtrycpJhiOMx.png)
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
.
![Zrzut ekranu przedstawia instalator Qt. krok drugi Open Source Obligations. Wewnątrz okna znajdują się informacje o licencji oraz dwa pola wyboru. Pierwsze po przeczytaniu obligacji dotyczących używania programu, drugie informujące o byciu osobą prywatną.](https://static.zpe.gov.pl/portal/f/res-minimized/R1coj7I3vHFUv/1665413872/1BUtEXwqrIk4xQBhJwUBsA6Czxv3WSzL.png)
Następnie możemy zdecydować, czy chcemy przesłać dodatkowe dane w celu ulepszenia przyszłych wersji Qt5. Zaznaczamy wybraną opcję i kontynuujemy instalację.
![Zrzut ekranu przedstawia instalator Qt. krok trzeci Contribute to Qt Development. W oknie zaznaczono opcję: Disable sending pseudonymous usage statistics in Qt Creator](https://static.zpe.gov.pl/portal/f/res-minimized/RENkk33AaUxAS/1665413872/nh72pS51Wm8yKT1EBQUtUKG9zrYg3RQD.png)
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
.
![Zrzut ekranu przedstawia instalator Qt. krok piąty Installation Folder. W górnej części okna znajduje się pole wyboru miejsca instalacji programu. Wybrany folder to: c:\Qt. W oknie zaznaczono opcję: Default desktop installation](https://static.zpe.gov.pl/portal/f/res-minimized/R1AMAylMERjsq/1665413872/ZtMPID9AvFBi9k0gBIDQU7JqwvEtLvfD.png)
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
.
![Zrzut ekranu przedstawia instalator Qt. krok szósty License Agreement. W oknie znajdują się informacje o umowie licencyjnej. W oknie zaznaczono opcję: I have read and agree to the terms contained in the license agreements.](https://static.zpe.gov.pl/portal/f/res-minimized/R1IqEurueH0SG/1665413872/2ak5tTDcE2tgwPBAWrtXNm5MwudRK9Mo.png)
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
.
![Zrzut ekranu przedstawia okno dialogowe: Nowy plik lub projekt w Qt Creator. Po lewej stronie okna znajduje się sekcja wyboru szablonu dzieląca się na: Projekty oraz Pliki i klasy. W sekcji środkowej znajduje się możliwość wyboru interfejsu użytkownika lub aplikacji konsolowej. W sekcji po prawej stronie znajdują się informacje o tworzonym pliku lub projekcie. Okno to posiada takie przyciski jak: Wybierz, Anuluj.](https://static.zpe.gov.pl/portal/f/res-minimized/R9f6fULt5w7nT/1665413873/1o65lQYgMP4npvfkuUOBiL71PfRb4dbz.png)
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:
![Zrzut ekranu ukazuje główne okno projektu w programie Qt Creator. Po lewej stronie ukazana jest struktura plików projektu. W kolejnych wierszach zapisano: 1: Konstrukcje_fraktalne, konstrukcje_fraktalne.prom, 2: Nagłówki, mainwindow.h, 3:Źródła, main.cpp, mainwindow.cpp. 4: Formularze, mainwindow.ui. Po prawej stronie ukazany jest kod znajdujący się w pliku: main.cpp.](https://static.zpe.gov.pl/portal/f/res-minimized/RkRSh4sUg2mEJ/1665413873/2E8Wj0RDDFnH3bWZkKbM1s0GpamcyN5b.png)
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:
![Zrzut ekranu przedstawia puste okno o tytule: MainWindow.](https://static.zpe.gov.pl/portal/f/res-minimized/RlpCT9DaVwiqg/1665413874/1foZMHvTKOB39YTLPFf2TozTUfbjPG9W.png)
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:
![Zrzut ekranu przedstawia okno: Smok Heighwaya. Znajduje się w nim niewyraźny kształt zbudowany z rzadko zagęszczonych punktów. Kształtem przypomina smoka.](https://static.zpe.gov.pl/portal/f/res-minimized/RkViX3cLSB7jE/1665413874/uE51RFTqPlgaSnYeOL67trOk6rQGqHdO.png)
Jak widzimy, warto zwiększyć liczbę generowanych punktów. Oto jak będzie wyglądał wynik programu dla parametru n = 1000000:
![Zrzut ekranu przedstawia okno: Smok Heighwaya. Znajduje się w nim wyraźny kształt zbudowany z zagęszczonych punktów. Kształtem przypomina smoka.](https://static.zpe.gov.pl/portal/f/res-minimized/RwDx7Bsj5ZeKI/1665413874/1t4xMJqkqBtLELy1gjxlzfxylvbjoKr7.png)
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:
![Zrzut ekranu przedstawia okno: Paproć Barnsleya. Znajduje się w nim niewyraźny kształt liścia paproci zbudowany z rzadko zagęszczonych punktów.](https://static.zpe.gov.pl/portal/f/res-minimized/R1XPY8wU20PiX/1665413874/1IcFPBylbRYSylIGWb650hO3mYfbRYkd.png)
Warto znów dopasować liczbę wygenerowanych punktów. Oto wynik programu uruchomionego z parametrem n = 1000000:
![Zrzut ekranu przedstawia okno: Paproć Barnsleya. Znajduje się w nim kształt liścia paproci zbudowany z zagęszczonych punktów.](https://static.zpe.gov.pl/portal/f/res-minimized/RGkyIiLV2lIhU/1665413874/2XoisfPynWyfCxmky1pavpFAeTpJHFex.png)
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