Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Zajmiemy się dwiema konstrukcjami fraktalnymi, które powstają w wyniku użycia systemu funkcji iterowanych IFSIFSIFS. Będą to fraktale – smok Heighwaya oraz paproć Barnsleya.

Aby napisać program wyświetlający konstrukcje fraktalne, których nie wizualizujemy za pomocą znaków tekstowych typu # lub *, skorzystamy z biblioteki graficznej. Chcąc wygenerować fraktale w języku Java, używamy pakietu SwingSwingSwing – tj. biblioteki graficznej służącej do tworzenia aplikacji wykorzystujących GUI.

Na potrzeby tego ćwiczenia utworzyliśmy pewien szablon związany z programowaniem obiektowym. Nie będziemy go szczegółowo omawiać, ale dowiemy się, w jaki sposób możemy z niego korzystać. Szablon ten będzie nieco inny dla każdej z dwóch konstrukcji, ponieważ rozmiary kształtów oraz ich pozycje w układzie współrzędnych są różne.

Szablon dla smoka Heighwaya:

Linia 1. import javax kropka swing kropka asterysk średnik. Linia 2. import java kropka awt kropka asterysk średnik. Linia 3. import java kropka util kropka LinkedList średnik. Linia 4. import java kropka util kropka Random średnik. Linia 6. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 7. prawy ukośnik prawy ukośnik lista dynamiczna przechowywująca punkty. Linia 8. private static LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny punkty znak równości new LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 11. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał punkty. Linia 12. at Override. Linia 13. public void paint otwórz nawias okrągły Graphics g zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. Graphics2D graphics2d znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły g średnik. Linia 15. for otwórz nawias okrągły Point punkt dwukropek punkty zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. graphics2d kropka drawLine otwórz nawias okrągły punkt kropka x przecinek punkt kropka y przecinek punkt kropka x przecinek punkt kropka y zamknij nawias okrągły średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy. Linia 20. prawy ukośnik prawy ukośnik funkcja rysująca punkt. Linia 21. public static void narysujPunkt otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. int x0 znak równości otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły x asterysk 400 kropka 0 zamknij nawias okrągły plus 180 średnik. Linia 23. int y0 znak równości 300 minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły y asterysk 400 kropka 0 zamknij nawias okrągły średnik. Linia 24. punkty kropka add otwórz nawias okrągły new Point otwórz nawias okrągły x0 przecinek y0 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 27. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. prawy ukośnik prawy ukośnik Początek programu minus utworzenie okna do rysowania. Linia 29. JFrame ramka znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 30. Canvas canvas znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 31. ramka kropka add otwórz nawias okrągły canvas zamknij nawias okrągły średnik. Linia 32. ramka kropka setSize otwórz nawias okrągły 700 przecinek 520 zamknij nawias okrągły średnik. Linia 33. ramka kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 35. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 37. prawy ukośnik prawy ukośnik w tym miejscu będziemy dodawać interesujący nas kod. 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. ramka kropka setTitle otwórz nawias okrągły cudzysłów Liczba iteracji znak równości cudzysłów plus n zamknij nawias okrągły średnik. Linia 43. canvas kropka repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 44. ramka kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 45. zamknij nawias klamrowy. Linia 46. zamknij nawias klamrowy.

Szablon dla paproci Barnsleya:

Linia 1. import javax kropka swing kropka asterysk średnik. Linia 2. import java kropka awt kropka asterysk średnik. Linia 3. import java kropka util kropka LinkedList średnik. Linia 4. import java kropka util kropka Random średnik. Linia 6. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 7. prawy ukośnik prawy ukośnik lista dynamiczna przechowywująca punkty. Linia 8. private static LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny punkty znak równości new LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 11. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał punkty. Linia 12. at Override. Linia 13. public void paint otwórz nawias okrągły Graphics g zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. Graphics2D graphics2d znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły g średnik. Linia 15. for otwórz nawias okrągły Point punkt dwukropek punkty zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. graphics2d kropka drawLine otwórz nawias okrągły punkt kropka x przecinek punkt kropka y przecinek punkt kropka x przecinek punkt kropka y zamknij nawias okrągły średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy. Linia 20. prawy ukośnik prawy ukośnik funkcja rysująca punkt. Linia 21. public static void narysujPunkt otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. int x0 znak równości otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły x asterysk 50 kropka 0 zamknij nawias okrągły plus 175 średnik. Linia 23. int y0 znak równości 525 minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły y asterysk 50 kropka 0 zamknij nawias okrągły średnik. Linia 24. punkty kropka add otwórz nawias okrągły new Point otwórz nawias okrągły x0 przecinek y0 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 27. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 29. JFrame ramka znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 30. Canvas canvas znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 31. ramka kropka add otwórz nawias okrągły canvas zamknij nawias okrągły średnik. Linia 32. ramka kropka setSize otwórz nawias okrągły 400 przecinek 600 zamknij nawias okrągły średnik. Linia 33. ramka kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 35. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 37. prawy ukośnik prawy ukośnik w tym miejscu będziemy dodawać interesujący nas kod. 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. ramka kropka setTitle otwórz nawias okrągły cudzysłów Liczba iteracji znak równości cudzysłów plus n zamknij nawias okrągły średnik. Linia 43. canvas kropka repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 44. ramka kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 45. zamknij nawias klamrowy. Linia 46. zamknij nawias klamrowy.

Schemat należy zapisać jako plik o nazwie CanvascanvasCanvas z rozszerzeniem .java. Pamiętajmy przy tym, aby w projekcie nie znajdowały się żadne inne pliki, w których występuje funkcja public static void main().

Przejdźmy teraz do instrukcji użycia szablonu. Interesujące nas elementy to sekcja kodu od linijki 35. do 39. – w tym miejscu możemy napisać potrzebny nam program. Dodatkowo szablon udostępnia funkcję narysujPunkt(double x, double y). Możemy ją wywołać w celu wypisania na ekran punktu o podanych współrzędnych. Funkcja ta przekształca współrzędne podane za pomocą zmiennych typu double na odpowiednio umiejscowione na ekranie punkty.

Smok Heighwaya

Przypomnijmy pseudokod, za którego pomocą generujemy ten fraktal:

Linia 1. prawy ukośnik prawy ukośnik punkt startowy. Linia 2. x ← 0 kropka 0. Linia 3. y ← 0 kropka 0. Linia 5. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 6. n ← 10000. Linia 8. wykonuj n razy dwukropek. Linia 9. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 10. x0 ← x. Linia 12. g ← losuj liczbę całkowitą z przedziału otwórz nawias ostrokątny 0 przecinek 1 zamknij nawias ostrokątny. Linia 14. jeżeli g znak równości 0 wykonuj. Linia 15. x ← 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y. Linia 16. y ← 0 kropka 5 asterysk x0 plus 0 kropka 5 asterysk y. Linia 17. w przeciwnym wypadku. Linia 18. x ← minus 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y plus 1. Linia 19. y ← 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.

Przedstawiony pseudokod łatwo jest przepisać na kod w języku Java. Zastanówmy się, w jaki sposób możemy wylosować liczbę całkowitą z przedziału <0,1>. W języku Java generowanie liczb pseudolosowych jest możliwe po utworzeniu w programie generatora takich właśnie liczb. Utworzenie tego obiektu wygląda następująco:

Linia 1. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik.

W tak utworzonym generatorze jest dostępna metoda nextInt(int n), która generuje losowe liczby całkowite od 0 (włącznie) do podanej liczby n (nie włączając n). Jeżeli chcemy wylosować liczbę całkowitą z przedziału <0, 1>, możemy zatem wykorzystać fragment kodu:

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 g znak równości generator kropka nextInt otwórz nawias okrągły 2 zamknij nawias okrągły średnik.

Wówczas pseudokod możemy zapisać jako program w języku Java. Zwróćmy uwagę na wykorzystanie dostępnej w szablonie funkcji narysujPunkt().

Linia 1. prawy ukośnik prawy ukośnik utworzenie generatora liczb pseudolosowych. Linia 2. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. prawy ukośnik prawy ukośnik punkt startowy. Linia 5. double x znak równości 0 kropka 0 przecinek y znak równości 0 kropka 0 średnik. Linia 7. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 8. int n znak równości 10000 średnik. Linia 10. 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 11. 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 12. int q znak równości generator kropka nextInt otwórz nawias okrągły 2 zamknij nawias okrągły średnik. Linia 14. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 15. double x0 znak równości x średnik. Linia 17. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. x znak równości 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y średnik. Linia 19. y znak równości 0 kropka 5 asterysk x0 plus 0 kropka 5 asterysk y średnik. Linia 20. zamknij nawias klamrowy. Linia 21. else otwórz nawias klamrowy. Linia 22. x znak równości minus 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y plus 1 średnik. Linia 23. y znak równości 0 kropka 5 asterysk x0 minus 0 kropka 5 asterysk y średnik. Linia 24. zamknij nawias klamrowy. Linia 26. prawy ukośnik prawy ukośnik Wysłanie punktu do narysowania. Linia 27. narysujPunkt otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 28. zamknij nawias klamrowy.

Na koniec pozostaje nam tylko umieścić utworzony kod w podanym wcześniej szablonie:

Linia 1. import javax kropka swing kropka asterysk średnik. Linia 2. import java kropka awt kropka asterysk średnik. Linia 3. import java kropka util kropka LinkedList średnik. Linia 4. import java kropka util kropka Random średnik. Linia 6. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 7. prawy ukośnik prawy ukośnik lista dynamiczna przechowywująca punkty. Linia 8. private static LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny punkty znak równości new LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 11. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał punkty. Linia 12. at Override. Linia 13. public void paint otwórz nawias okrągły Graphics g zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. Graphics2D graphics2d znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły g średnik. Linia 15. for otwórz nawias okrągły Point punkt dwukropek punkty zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. graphics2d kropka drawLine otwórz nawias okrągły punkt kropka x przecinek punkt kropka y przecinek punkt kropka x przecinek punkt kropka y zamknij nawias okrągły średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy. Linia 20. prawy ukośnik prawy ukośnik funkcja rysująca punkt. Linia 21. public static void narysujPunkt otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. int x0 znak równości otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły x asterysk 400 kropka 0 zamknij nawias okrągły plus 180 średnik. Linia 23. int y0 znak równości 300 minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły y asterysk 400 kropka 0 zamknij nawias okrągły średnik. Linia 24. punkty kropka add otwórz nawias okrągły new Point otwórz nawias okrągły x0 przecinek y0 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 27. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. prawy ukośnik prawy ukośnik Początek programu minus utworzenie okna do rysowania. Linia 29. JFrame ramka znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 30. Canvas canvas znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 31. ramka kropka add otwórz nawias okrągły canvas zamknij nawias okrągły średnik. Linia 32. ramka kropka setSize otwórz nawias okrągły 700 przecinek 520 zamknij nawias okrągły średnik. Linia 33. ramka kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 35. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 37. prawy ukośnik prawy ukośnik utworzenie generatora liczb pseudolosowych. Linia 38. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 40. prawy ukośnik prawy ukośnik punkt startowy. Linia 41. double x znak równości 0 kropka 0 przecinek y znak równości 0 kropka 0 średnik. Linia 43. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 44. int n znak równości 10000 średnik. Linia 46. 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 47. 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 48. int q znak równości generator kropka nextInt otwórz nawias okrągły 2 zamknij nawias okrągły średnik. Linia 50. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 51. double x0 znak równości x średnik. Linia 53. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 54. x znak równości 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y średnik. Linia 55. y znak równości 0 kropka 5 asterysk x0 plus 0 kropka 5 asterysk y średnik. Linia 56. zamknij nawias klamrowy. Linia 57. else otwórz nawias klamrowy. Linia 58. x znak równości minus 0 kropka 5 asterysk x minus 0 kropka 5 asterysk y plus 1 średnik. Linia 59. y znak równości 0 kropka 5 asterysk x0 minus 0 kropka 5 asterysk y średnik. Linia 60. zamknij nawias klamrowy. Linia 62. prawy ukośnik prawy ukośnik Wysłanie punktu do narysowania. Linia 63. narysujPunkt otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 64. zamknij nawias klamrowy. Linia 66. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 68. prawy ukośnik prawy ukośnik Koniec programu minus wyświetlenie wyniku. Linia 69. ramka kropka setTitle otwórz nawias okrągły cudzysłów Liczba iteracji znak równości cudzysłów plus n zamknij nawias okrągły średnik. Linia 70. canvas kropka repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 71. ramka kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 72. zamknij nawias klamrowy. Linia 73. zamknij nawias klamrowy.

Oto przykładowe efekty uruchomienia programu dla różnych wartości zmiennej n:

R1M0cvwze1Vj1
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
R1TGx3a8ScNCb
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
RpBC5Z7vl98w3
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Paproć Barnsleya

Kształt paproci Barnsleya generujemy na podobnej zasadzie, choć w nieco bardziej skomplikowany sposób. Pseudokod algorytmu, który pozwala nam realizować konstrukcję tego fraktala, wygląda następująco:

Linia 1. prawy ukośnik prawy ukośnik punkt startowy. Linia 2. x ← 0 kropka 0. Linia 3. y ← 0 kropka 0. Linia 5. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 6. n ← 10000. Linia 8. wykonuj n razy dwukropek. Linia 9. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 10. x0 ← x. Linia 12. g ← losuj liczbę całkowitą z przedziału otwórz nawias ostrokątny 0 przecinek 99 zamknij nawias ostrokątny. Linia 14. jeżeli q otwórz nawias ostrokątny 1. Linia 15. x ← 0 średnik. Linia 16. y ← 0 kropka 16 asterysk y średnik. Linia 17. w przeciwnym wypadku jeżeli q otwórz nawias ostrokątny 86. Linia 18. x ← 0 kropka 85 asterysk x plus 0 kropka 04 asterysk y średnik. Linia 19. y ← 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. Linia 21. x ← 0 kropka 2 asterysk x minus 0 kropka 26 asterysk y średnik. Linia 22. y ← 0 kropka 23 asterysk x0 plus 0 kropka 22 asterysk y plus 1 kropka 6 średnik. Linia 23. w przeciwnym wypadku. Linia 24. x ← minus 0 kropka 15 asterysk x plus 0 kropka 28 asterysk y średnik. Linia 25. y ← 0 kropka 26 asterysk x0 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.

Wiemy już, jak utworzyć generator losowy oraz wylosować liczbę całkowitą z przedziału <0,1>. W analogiczny sposób będziemy w stanie wylosować 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 generator kropka nextInt otwórz nawias okrągły 100 zamknij nawias okrągły średnik.

Wówczas realizacja algorytmu będzie wyglądała następująco:

Linia 1. prawy ukośnik prawy ukośnik utworzenie generatora liczb pseudolosowych. Linia 2. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. prawy ukośnik prawy ukośnik punkt startowy. Linia 5. double x znak równości 0 kropka 0 przecinek y znak równości 0 kropka 0 średnik. Linia 7. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 8. int n znak równości 100000 średnik. Linia 10. 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 11. 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 12. int q znak równości generator kropka nextInt otwórz nawias okrągły 100 zamknij nawias okrągły średnik. Linia 14. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 15. double x0 znak równości x średnik. Linia 17. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. x znak równości 0 średnik. Linia 19. y znak równości 0 kropka 16 asterysk y średnik. Linia 20. zamknij nawias klamrowy. Linia 21. 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 22. x znak równości 0 kropka 85 asterysk x plus 0 kropka 04 asterysk y średnik. Linia 23. y znak równości minus 0 kropka 04 asterysk x0 plus 0 kropka 85 asterysk y plus 1 kropka 6 średnik. Linia 24. zamknij nawias klamrowy. Linia 25. 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 26. x znak równości 0 kropka 2 asterysk x minus 0 kropka 26 asterysk y średnik. Linia 27. y znak równości 0 kropka 23 asterysk x0 plus 0 kropka 22 asterysk y plus 1 kropka 6 średnik. Linia 28. zamknij nawias klamrowy. Linia 29. else otwórz nawias klamrowy. Linia 30. x znak równości minus 0 kropka 15 asterysk x plus 0 kropka 28 asterysk y średnik. Linia 31. y znak równości 0 kropka 26 asterysk x0 plus 0 kropka 24 asterysk y plus 0 kropka 44 średnik. Linia 32. zamknij nawias klamrowy. Linia 34. prawy ukośnik prawy ukośnik Wysłanie punktu do narysowania. Linia 35. narysujPunkt otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 36. zamknij nawias klamrowy.

Tak utworzony kod trzeba jeszcze umieścić w dostarczonym szablonie.

Uwaga! Szablon dla paproci Barnsleya różni się od szablonu dla smoka Heighwaya.

Linia 1. import javax kropka swing kropka asterysk średnik. Linia 2. import java kropka awt kropka asterysk średnik. Linia 3. import java kropka util kropka LinkedList średnik. Linia 4. import java kropka util kropka Random średnik. Linia 6. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 7. prawy ukośnik prawy ukośnik lista dynamiczna przechowywująca punkty. Linia 8. private static LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny punkty znak równości new LinkedList otwórz nawias ostrokątny Point zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 11. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał punkty. Linia 12. at Override. Linia 13. public void paint otwórz nawias okrągły Graphics g zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. Graphics2D graphics2d znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły g średnik. Linia 15. for otwórz nawias okrągły Point punkt dwukropek punkty zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. graphics2d kropka drawLine otwórz nawias okrągły punkt kropka x przecinek punkt kropka y przecinek punkt kropka x przecinek punkt kropka y zamknij nawias okrągły średnik. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy. Linia 20. prawy ukośnik prawy ukośnik funkcja rysująca punkt. Linia 21. public static void narysujPunkt otwórz nawias okrągły double x przecinek double y zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. int x0 znak równości otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły x asterysk 50 kropka 0 zamknij nawias okrągły plus 175 średnik. Linia 23. int y0 znak równości 525 minus otwórz nawias okrągły int zamknij nawias okrągły otwórz nawias okrągły y asterysk 50 kropka 0 zamknij nawias okrągły średnik. Linia 24. punkty kropka add otwórz nawias okrągły new Point otwórz nawias okrągły x0 przecinek y0 zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 27. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 29. JFrame ramka znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 30. Canvas canvas znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 31. ramka kropka add otwórz nawias okrągły canvas zamknij nawias okrągły średnik. Linia 32. ramka kropka setSize otwórz nawias okrągły 400 przecinek 600 zamknij nawias okrągły średnik. Linia 33. ramka kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 35. prawy ukośnik asterysk początek właściwej części kodu asterysk prawy ukośnik. Linia 37. prawy ukośnik prawy ukośnik utworzenie generatora liczb pseudolosowych. Linia 38. Random generator znak równości new Random otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 40. prawy ukośnik prawy ukośnik punkt startowy. Linia 41. double x znak równości 0 kropka 0 przecinek y znak równości 0 kropka 0 średnik. Linia 43. prawy ukośnik prawy ukośnik liczba generowanych punktów. Linia 44. int n znak równości 100000 średnik. Linia 46. 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 47. 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 48. int q znak równości generator kropka nextInt otwórz nawias okrągły 100 zamknij nawias okrągły średnik. Linia 50. prawy ukośnik prawy ukośnik kopia zmiennej x. Linia 51. double x0 znak równości x średnik. Linia 53. if otwórz nawias okrągły q otwórz nawias ostrokątny 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 54. x znak równości 0 średnik. Linia 55. y znak równości 0 kropka 16 asterysk y średnik. Linia 56. zamknij nawias klamrowy. Linia 57. 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 58. x znak równości 0 kropka 85 asterysk x plus 0 kropka 04 asterysk y średnik. Linia 59. y znak równości minus 0 kropka 04 asterysk x0 plus 0 kropka 85 asterysk y plus 1 kropka 6 średnik. Linia 60. zamknij nawias klamrowy. Linia 61. 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 62. x znak równości 0 kropka 2 asterysk x minus 0 kropka 26 asterysk y średnik. Linia 63. y znak równości 0 kropka 23 asterysk x0 plus 0 kropka 22 asterysk y plus 1 kropka 6 średnik. Linia 64. zamknij nawias klamrowy. Linia 65. else otwórz nawias klamrowy. Linia 66. x znak równości minus 0 kropka 15 asterysk x plus 0 kropka 28 asterysk y średnik. Linia 67. y znak równości 0 kropka 26 asterysk x0 plus 0 kropka 24 asterysk y plus 0 kropka 44 średnik. Linia 68. zamknij nawias klamrowy. Linia 70. prawy ukośnik prawy ukośnik Wysłanie punktu do narysowania. Linia 71. narysujPunkt otwórz nawias okrągły x przecinek y zamknij nawias okrągły średnik. Linia 72. zamknij nawias klamrowy. Linia 74. prawy ukośnik asterysk koniec właściwej części kodu asterysk prawy ukośnik. Linia 76. prawy ukośnik prawy ukośnik Koniec programu minus wyświetlenie wyniku. Linia 77. ramka kropka setTitle otwórz nawias okrągły cudzysłów Liczba iteracji znak równości cudzysłów plus n zamknij nawias okrągły średnik. Linia 78. canvas kropka repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 79. ramka kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 80. zamknij nawias klamrowy. Linia 81. zamknij nawias klamrowy.

Przykładowe wyniki uruchomiania powyższego programu dla różnych liczb iteracji:

R1NXEIOKiRZdY
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
RKb4ScDIkXJIh
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-ND 1.0.
R1K8vCZl3rJMa
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Zbiór Cantora

Popularnym fraktalem jest tzw. trójkowy zbiór Cantora. Jego tworzenie polega na narysowaniu odcinka o pewnej długości oraz podzielenia go na trzy równe części. Następnie środkowa część jest usuwana. Proces ten powtarza się następnie dla pozostałych odcinków. Oznacza to, że w pierwszym kroku usunięta zostanie jedna trzecia długości pierwotnego odcinka, w drugim dwa razy jedna dziewiąta itp.

Generowanie tego zbioru najwygodniej przedstawić przy pomocy rekurencji. Za przypadek bazowy zdefiniujemy wywołanie funkcji, w którym narysowany będzie jeden odcinek, zaś przypadkiem rekurencyjnym będzie każde wywołanie, które będzie wymagało rysowania więcej niż jednego odcinka. Ponieważ wszystkie odcinki powstają poprzez wycinanie fragmentów innego odcinka, obliczenia możemy sprowadzić do jednej współrzędnej. Zapiszmy funkcję przy pomocy listy kroków:

Linia 1. funkcja Cantor otwórz nawias okrągły stopień przecinek pocz przecinek dł przecinek gł zamknij nawias okrągły dwukropek. Linia 2. jeżeli gł znak równości stopień dwukropek. Linia 3. prawy ukośnik prawy ukośnik przypadek bazowy. Linia 4. narysuj odcinek zaczynający się w pocz i mający długość dł. Linia 5. zakończ. Linia 7. prawy ukośnik prawy ukośnik przypadek rekurencyjny. Linia 8. prawy ukośnik prawy ukośnik długość krótszego odcinka to 1 prawy ukośnik 3 długości dłuższego. Linia 9. Cantor otwórz nawias okrągły stopień przecinek pocz przecinek dł prawy ukośnik 3 przecinek gł plus 1 zamknij nawias okrągły. Linia 11. prawy ukośnik prawy ukośnik drugi krótszy odcinek zaczyna się w 2 prawy ukośnik 3 dłuższego odcinka. Linia 12. Cantor otwórz nawias okrągły stopień przecinek pocz plus otwórz nawias okrągły 2 asterysk dł zamknij nawias okrągły prawy ukośnik 3 przecinek dł prawy ukośnik 3 przecinek gł plus 1 zamknij nawias okrągły.

stopień mówi o tym, ile razy usuwana będzie część odcinka w zadanym fraktalu. pocz to współrzędna początku odcinka, to jego długość, zaś oznacza, na jakiej głębokości wywołania rekurencyjnego znajduje się funkcja.

Po zmodyfikowaniu naszego szablonu tak, aby umożliwiał on łatwe rysowanie linii, program rysujący zbiór Cantora prezentuje się następująco:

Linia 1. import javax kropka swing kropka asterysk średnik. Linia 2. import java kropka awt kropka asterysk średnik. Linia 3. import java kropka util kropka LinkedList średnik. Linia 5. public class Canvas extends JPanel otwórz nawias klamrowy. Linia 7. prawy ukośnik prawy ukośnik klasa pomocnicza przechowująca dwa końce odcinka. Linia 8. private static class Linia. Linia 9. otwórz nawias klamrowy. Linia 10. public int x0 średnik. Linia 11. public int x1 średnik. Linia 12. public int y0 średnik. Linia 13. public int y1 średnik. Linia 15. prawy ukośnik prawy ukośnik Konstruktor do linii idących poziomo w prawo. Linia 16. public Linia otwórz nawias okrągły int x przecinek int y przecinek int dl zamknij nawias okrągły. Linia 17. otwórz nawias klamrowy. Linia 18. x0 znak równości x średnik. Linia 19. y0 znak równości y średnik. Linia 20. x1 znak równości x plus dl średnik. Linia 21. y1 znak równości y średnik. Linia 22. zamknij nawias klamrowy. Linia 23. zamknij nawias klamrowy. Linia 25. prawy ukośnik prawy ukośnik lista przechowująca linie. Linia 26. private static final LinkedList otwórz nawias ostrokątny Linia zamknij nawias ostrokątny linie znak równości new LinkedList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 28. prawy ukośnik prawy ukośnik nadpisanie sposobu wyświetlania komponentu Canvas. Linia 29. prawy ukośnik prawy ukośnik w taki sposób przecinek aby wyświetlał punkty. Linia 30. at Override. Linia 31. public void paint otwórz nawias okrągły Graphics g zamknij nawias okrągły otwórz nawias klamrowy. Linia 32. Graphics2D graphics2d znak równości otwórz nawias okrągły Graphics2D zamknij nawias okrągły g średnik. Linia 33. for otwórz nawias okrągły Linia e dwukropek linie zamknij nawias okrągły otwórz nawias klamrowy. Linia 34. graphics2d kropka drawLine otwórz nawias okrągły e kropka x0 przecinek e kropka y0 przecinek e kropka x1 przecinek e kropka y1 zamknij nawias okrągły średnik. Linia 35. zamknij nawias klamrowy. Linia 36. zamknij nawias klamrowy. Linia 38. public static void cantor otwórz nawias okrągły int stopien przecinek int pocz przecinek int dl przecinek int gl zamknij nawias okrągły. Linia 39. otwórz nawias klamrowy. Linia 40. prawy ukośnik prawy ukośnik. Linia 41. if otwórz nawias okrągły gl znak równości znak równości stopien zamknij nawias okrągły. Linia 42. otwórz nawias klamrowy. Linia 43. prawy ukośnik prawy ukośnik dodanie nowej linii. Linia 44. linie kropka add otwórz nawias okrągły new Linia otwórz nawias okrągły pocz przecinek 520 prawy ukośnik 2 przecinek dl zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 45. return średnik. Linia 46. zamknij nawias klamrowy. Linia 48. prawy ukośnik prawy ukośnik pierwsza część. Linia 49. cantor otwórz nawias okrągły stopien przecinek pocz przecinek dl prawy ukośnik 3 przecinek gl plus 1 zamknij nawias okrągły średnik. Linia 51. prawy ukośnik prawy ukośnik przerwa. Linia 52. prawy ukośnik prawy ukośnik kropka kropka kropka. Linia 54. prawy ukośnik prawy ukośnik druga część. Linia 55. cantor otwórz nawias okrągły stopien przecinek pocz plus otwórz nawias okrągły otwórz nawias okrągły 2 asterysk dl zamknij nawias okrągły prawy ukośnik 3 zamknij nawias okrągły przecinek dl prawy ukośnik 3 przecinek gl plus 1 zamknij nawias okrągły średnik. Linia 56. zamknij nawias klamrowy. Linia 58. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 59. prawy ukośnik prawy ukośnik Początek kodu minus utworzenie okna do rysowania. Linia 60. JFrame frame znak równości new JFrame otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 61. Canvas canvas znak równości new Canvas otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 62. frame kropka add otwórz nawias okrągły canvas zamknij nawias okrągły średnik. Linia 63. frame kropka setSize otwórz nawias okrągły 700 przecinek 520 zamknij nawias okrągły średnik. Linia 64. frame kropka setDefaultCloseOperation otwórz nawias okrągły JFrame kropka EXIT podkreślnik ON podkreślnik CLOSE zamknij nawias okrągły średnik. Linia 66. prawy ukośnik prawy ukośnik wywołanie funkcji generującej fraktal. Linia 67. cantor otwórz nawias okrągły 4 przecinek 100 przecinek 700 minus 200 przecinek 0 zamknij nawias okrągły średnik. Linia 69. prawy ukośnik prawy ukośnik Koniec programu minus wyświetlenie wyniku. Linia 70. canvas kropka repaint otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 71. frame kropka setVisible otwórz nawias okrągły true zamknij nawias okrągły średnik. Linia 72. zamknij nawias klamrowy. Linia 73. zamknij nawias klamrowy.

Przykładowe wywołanie programu dla zbioru Cantora 4 stopnia:

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

Wywołanie programu dla zbioru Cantora 6 stopnia:

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

Słownik

canvas
canvas

(ang. 'płótno') termin używany często w celu określenia fragmentu programu, w którym następuje rysowanie elementów

IFS
IFS

(ang. iterated function system – system funkcji iterowanych) funkcje, które pozwalają generować konstrukcje samopodobne

Swing
Swing

biblioteka graficzna w języku Java; to nowsza i ulepszona wersja biblioteki AWT (Abstract Window Toolkit)