eMatematikas
Kategorijos +Nauja tema Prisijungti        

Sierpinskio trikampis + Mobius transformacija


Sveiki, neseniai universitete gavau vieną užduotį, kuria atlikęs gavau visai įdomius rezultatus, o kadangi tai yra susiję su matematika, tai pasidalinti savo darbu, gal kam nors irgi pasirodys įdomu :) . Taigi, man reikėjo atlikti Mobius (Möbius/Moebius...) transformacija Sierpinskio trikampiui. Jei jau žinote kas tai yra arba Jums neįdomu, tai galite tiesiog pasižiūrėti kas gavosi:
http://valdas0.bitbucket.org/index.html
Atsidarę turėtumėte pamatyti Sierpinskio trikampį ir kelis neaiškius laukus. Jei paspausite mygtuką start tai pamatysite, kad nieko nevyksta :D. Taip yra nes ten įvesta nieko nekeičianti transformacija. Pabandykit įvesti šią transformaciją:
a = 1+0i
b = 0+0i
c = 1+0i
d = 1+0i

T.y., prie c raidės esančiame lauke pakeiskite 0 į 1 ir tada paspauskite start. Jei viskas gerai, tai turėtų prasidėti animacija. Dar kelios įdomios mano atrastos transformacijos:
a = 0        a = 10            a = 0
b = 1        b = 0            b = 1
c = 3        c = -10 + 10i    c = -3
d = i        d = i            d = i

Geriausia patiems mėginti paeksperimentuoti su tais parametrais ir bandyti išgauti kažką įdomaus :) .
Tinklapyje yra dar du papildomi laukai, kurie neturi nieko bendro su pačia transformacija. Laukas Frames nusako kiek kadrų bus animacijoje, t.y. kuo mažesnis skaičius ten įrašytas, tuo greičiau pasibaigs animacija. Jei iš vis nenorite matyti animacijos, o tik galutinį rezultatą, įrašykite 1. Laukas Iteration nusako iki kurios iteracijos yra konstruojamas Sierpinskio trikampis (kind of). Kuo didesnis tas skaičiukas, tuo tikslesnis ("gražesnis") bus trikampis, t.y. jis bus sudarytas iš daugiau trikampiukų. Su šiuo skaičiumi patarčiau nepersistengti, nors ir bandžiau optimizuoti kodą, bet kadangi su kiekviena iteracija trikampių skaičius išauga eksponentiškai, tai su didelėmis reikšmėmis transformacijos gali pradėti strigti (jau su 14 iteracija mano laptopui sunku susidoroti).
Šiek tiek vėliau trumpai aprašysiu ką iš tikrųjų daro mano programa :)

Paskutinį kartą atnaujinta 2015-10-16

0

Man jau ir nuo trečios kombinacijos mozilla pakibo :)
Gražu šiaip. Visą java pats rašei?

0

Taigi, pradėsiu nuo Sierpinskio trikampio. Visad galvodavau, kad kiekvienas bent kiek išsilavinęs žmogus yra girdėjęs apie Sierpinskio trikampį, bet mano patirtis rodo kai ką kito :D . Sierpinskio trikampis yra fraktalas, kurio sudarymo algoritmas yra labai paprastas:
1. Pasiimame lygiakraštį trikampį
2. Padalijame jį į 4 vienodo dydžio lygiakraščius trikampius ir išmetame centrinį
3. Kartojame 2 žingsnį su likusiais trikampiais
Rezultatas: https://upload.wikimedia.org/wikipedia/commons/7/74/Animated_construction_of_Sierpinski_Triangle.gif

O dabar laikas Mobius transformacijai. Bet pirmiau paminėsiu, kad mano programoje kiekvieno taško koordinatės yra koduojamios kompleksiniais skaičiais, pavyzdžiui, skaičius z=100+250i atitiktų tašką koordinatėse (100, 250). Apie tai užsiminiau, nes Mobius transformacija dirba su kompleksiniais skaičiais, t.y., ji transformuoja vieną kompleksinį skaičių į kitą kompleksinį skaičių ir užsirašo taip: [tex]f(z)=\frac{az+b}{cz+d}[/tex]. Iš čia ir atsirado tie "keisti" laukai mano programoje. Transformacija šiek tiek paaiškina šis trumpas video https://www.youtube.com/watch?v=JX3VmDgiFnY
Galime ja šiek tiek paanalizuoti, galbūt pasidarys šiek tiek aiškiau kas atsitinka su objektu atlikus šią transformaciją. Pavyzdžiui, su kokiomis (a, b, c, d) reikšmėmis ši transformacija nepajudina objekto (transformuoti objektą = atlikti transformacija kiekvienam jo taškui) iš vietos? Daug galvoti nereikia, jei paimsime reikšmes (1, 0, 0, 1), tai gausime [tex]f(z)=\frac{z}{1}=z[/tex]. Jei norėtume padidinti objektą du kartus, tai galėtume naudoti (2, 0, 0, 1) : [tex]f(z)=2z[/tex]. Panašiai galima ir sumažinti objektą. Taip pat galime atlikti objekto postūmį x ašimi per atstumą d su transformacija (1, d, 0, 1) : [tex]f(z)=z+d[/tex]. Panašiai ir su y ašimi su transformacija (1, d*i, 0, 1) : [tex]f(z)=z + di[/tex]. Ir aišku galima iš kart stumti abejomis ašimis iš karto (1, dx + dy*i, 0 , 1) : [tex]f(z) = z + d_x + d_yi[/tex]. Kitas transformacijas jau šiek tiek sunkiau atrasti ir paaiškinti. Turbūt daugiau nesiplėsiu, nes visų detalių vis tiek forumo pranešime nesurašysiu, o ir nedaug kam jos bus įdomios :) .

0

VitalijusMan jau ir nuo trečios kombinacijos mozilla pakibo :)
Gražu šiaip. Visą java pats rašei?

Rašiau su javascript. Grafikos piešimui (na praktiškai vienintelė naudota funkcija buvo skirta piešti atkarpoms) naudojau pixi.js ir kompleksinių skaičių operacijoms panaudojau math.js . Dėl to teoriškai galima tą tinklapį ir su telefonu atsidaryti. Jei matai, kad transformacijos veikia lėtai, tai reikėtų susitaikyti, kad kompiuteris nepaveža dabartinio piešiamio trikampių skaičiaus ir sumažinti iteraciją arba apkaltinti programuotoja dėl neoptimizuoto kodo :D

0

Šiandien vėl buvau šią programą įsijungęs, tai gan gražią transformaciją atradau :)
a = 0; b = 0.2; c = 1; d = 0

0

Norėdami rašyti žinutes privalote prisijungti!