Gra w chaos

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Liść paproci wygenerowany przy pomocy gry 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.

Algorytm[edytuj | edytuj kod]

Zaczynając od pewnego punktu x_0 kolejne iteracje są dane przy pomocy wzoru x_{n+1} = f^m(x_n), gdzie f^m(x) 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 x_0 należy do atraktora systemu funkcji iterowanych, wówczas wszystkie punkty x_n 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 | edytuj kod]

Trójkąt Sierpińskiego

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 | edytuj kod]

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)

Zobacz też[edytuj | edytuj kod]