Gra w chaos
Gra w chaos to algorytm komputerowego generowania obrazów pewnych fraktali. Generuje on przybliżony obraz atraktora lub punktu stałego dowolnego systemu funkcji iterowanych.
Spis treści |
Algorytm [edytuj]
Zaczynając od pewnego punktu
kolejne iteracje są dane przy pomocy wzoru
, gdzie
jest jedną z funkcji iterowanych, wybieraną niezależnie i losowo dla każdej iteracji. Iteracje zbiegają się do punktu stałego systemu funkcji iterowanych. Jeżeli wartość początkowa
należy do atraktora systemu funkcji iterowanych, wówczas wszystkie punkty
również należą do tego atraktora i z prawdopodobieństwem 1 tworzą w nim zbiór gęsty.
Przykład dla trójkąta Sierpińskiego [edytuj]
Na początku stawia się na płaszczyźnie 3 dowolne punkty (powinny być niewspółliniowe, gdyż inaczej fraktal zdegeneruje się do odcinka), po czym wybiera sobie kolejny punkt płaszczyzny, zwany punktem gry (game point). Następnie wybiera się dowolny z trzech punktów obranych na samym początku (można je oznaczyć 1, 2 i 3, po czym korzystając z generatora liczb losowych wybierać je) i stawia punkt w połowie odległości między czwartym punktem, a tym wybranym. Powtarza się ten krok, za każdym razem oznaczając punkt leżący dokładnie w połowie odległości między ostatnio postawionym, a jednym z trzech pierwszych.
Efektem algorytmu – zakładając, że punkty były losowane z mniej więcej takim samym prawdopodobieństwem – jest pewien wariant trójkąta Sierpińskiego. Jego wierzchołkami są trzy punkty wybrane na samym początku gry.
Implementacja [edytuj]
Poniższy przykład (w języku Python) generuje trójkąt Sierpińskiego przy użyciu gry w chaos, korzystając z biblioteki pygame.
from random import * sqr = lambda a:a*a import pygame scr = pygame.display.set_mode([501, 501]) cnt = 3 pts = ( 0 + 500j, 500 + 500j, 250 + 0j, ) colors = ( (255, 0, 0), (0, 255, 0), (0, 0, 255) ) ind = randrange(cnt) pt = pts[ind] color = colors[ind] div = 2 for i in range(100000): pygame.draw.rect(scr, color, [pt.real, pt.imag, 2, 2]) newind = randrange(cnt) pt = (pt + pts[newind]) / div color = colors[newind] pygame.display.flip() while True: key = pygame.event.poll() if key.type == pygame.KEYDOWN and key.key == pygame.K_ESCAPE: pygame.quit() break pygame.time.delay(100)