Sierpinski carpet neboli koberec u Sierpinských

PhDr. Mgr. Jeroným Klimeš, Ph.D. 2017-05-29

www.klimes.us

Protože jsem nikdy pořádně nezvládl rekurentní programování, tak jsem tento fraktál vyřešil jednodušeji. Vygeneruji náhodný bod a rozhodnu, jestli je zobrazen a jakou barvou. Barva se volí podle úrovně. Překreslit koberec můžete pomocí klávesy F5. Vyčkejte ale, než to vypočítá cca 200 000 bodů.

První úroveň je největší čtverec, což je prostřední třetina celého koberce. Mám nahodilý bod [x,y] a plátno má rozměry 600x600 bodů. Takže testuji podmínky, zda je x (resp. y) v prostřední třetině: Jestliže x>200 a současně x<=400, tak ho zobraz.

Druhá a následující úrovně, tzn. ty stále menší třetinové čtverce, jsou trochu složitější. Teoreticky bych to musel projít tolikrát, kolik má daná úroveň řádků. Abych se této zdlouhavé práci vyhnul, řešil jsem to modulární aritmetikou čili zbytkovými třídami. Pokusím se to trochu vysvětlit na menším obrázku, který má pouze 27 bodů, pixelů a pouze na jedné jeho ose.

Pixely 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
První úroveň








I. I. I. I. I. I. I. I. I.








Druhá úroveň


II. II. II.





II. II. II.





II. II. II.


Třetí úroveň
III.

III.

III.

III.

III.

III.

III.

III.

III.

Zbytkové třídy pro druhou úroveň


Mod 9      
     
Mod 9      
     
Mod9
4 4
5 5
6 6
13 4
14 5
15 6
22 4
23 5
24 6

13 mod 9 = 4, protože když dělím 13 devíti, tak dostanu zbytek 4.

Pro druhou třídu tedy testuji, zda zbytkové třídy modulo 9 pro daný pixel leží v rozmezí 4 až 6.

Zbytková třída pro třetí úroveň

Zde stačí testovat, zda bod je členem zbytkové třídy modulo 3.


2 5 8 11 14 17 20 23 26
Mod 3 2 2 2 2 2 2 2 2 2

Dolní hranice pro zbytkové třídy jednotlivých úrovní je třetina šíře předchozí úrovně, tedy jedná se o mocninnou řadu, tzn.

sire×(1/3)uroven

1. úroveň = 27×(1/3)^1 = 27/3 = 9 Tedy bod modulo 27 musí být větší než 9 a menší nebo rovno než 2×9, tzn. 18

2. úroveň = 27×(1/3)^2 = 27/9 = 3 Tedy bod modulo 9 musí být větší než 3 a menší nebo rovno než 2×3, tzn. 6

3. úroveň = 27×(1/3)^3 = 27/27 = 1 Tedy bod modulo 3 musí být větší než 1 a menší nebo rovno než 2×1, tzn. 2

To pak stačilo napsat to do vzorečků a zobecnit pro jakýkoli počet úrovní:

Pro jakýkoli bod [x,y] a obrázek o rozměrech 600×600 platí:

Na první úrovni je bod černý, jestliže x > 200 & x<=400 & y>200 & y<=400

Podmínky pro osu x na libovolné úrovni vyjádřené modulání aritmetikou jsou proto mnohem jednodušší a rychlejší, než by představovalo testování po všech řádcích:

Doufám, že i pro Vás bylo toto setkání s modulární aritmetikou přínosné a osvěžující. Je to takový zajímavý výlet do světa absolutního jinde, kde se nikdo nerozvádí a neválčí o děti, že? :-)