Barnsleyova kapradina - Barnsley fern

The Barnsleyova kapradina je fraktální pojmenoval podle Britů matematik Michael Barnsley který to poprvé popsal ve své knize Fraktály všude.[1] Udělal to, aby se podobal černé slezině, Asplenium adiantum-nigrum.
Dějiny
Kapradina je jedním ze základních příkladů podobný množiny, tj. je to matematicky generovaný vzor, který lze reprodukovat při jakémkoli zvětšení nebo zmenšení. Jako Sierpinského trojúhelník, Barnsleyova kapradina ukazuje, jak lze graficky krásné struktury stavět z opakovaného použití matematických vzorců s počítači. Barnsleyho kniha z roku 1988 Fraktály všude je založen na kurzu, který učil pro vysokoškolské a postgraduální studenty na Matematické škole, Gruzínský technologický institut, volala Fraktální geometrie. Po vydání knihy byl vyvinut druhý kurz, tzv Teorie fraktálního měření.[1] Barnsleyho práce byla zdrojem inspirace grafici pokus o imitaci přírody pomocí matematických modelů.

Kód kapradiny vyvinutý Barnsley je příkladem iterovaný funkční systém (IFS) k vytvoření fraktálu. To vyplývá z věta o koláži. Používal fraktály k modelování rozmanité škály fenomenálních věd a technologií, ale konkrétně rostlinných struktur.
IFS poskytují modely pro určité rostliny, listy a kapradiny na základě podobnosti sebe sama, která se často vyskytuje v rozvětvených strukturách v přírodě. Příroda však také vykazuje náhodnost a variace z jedné úrovně na druhou; žádné dvě kapradiny nejsou úplně stejné a z rozvětvených listů se v menším měřítku stávají listy. Fraktály s proměnnými V umožňují takovou náhodnost a variabilitu napříč měřítky a současně připouštějí trvalou závislost na parametrech, které usnadňují geometrické modelování. Tyto faktory nám umožňují vytvořit hybridní biologické modely ...... spekulujeme, že když je nalezen V-variabilní geometrický fraktální model, který má dobrou shodu s geometrií dané rostliny, pak existuje specifický vztah mezi nimi kódové stromy a informace uložené v genech rostliny.
—Michael Barnsley et al.[2]
Konstrukce

Barnsleyova kapradina používá čtyři afinní transformace. Vzorec pro jednu transformaci je následující:
Barnsley ukazuje IFS kód pro jeho Černá slezinovka fraktální kapradina jako matice hodnot uvedených v tabulce.[3] V tabulce jsou sloupce „a“ až „f“ koeficienty rovnice a „p“ představuje faktor pravděpodobnosti.
w | A | b | C | d | E | F | p | Část vygenerována |
---|---|---|---|---|---|---|---|---|
ƒ1 | 0 | 0 | 0 | 0.16 | 0 | 0 | 0.01 | Zastavit |
ƒ2 | 0.85 | 0.04 | −0.04 | 0.85 | 0 | 1.60 | 0.85 | Postupně menší letáky |
ƒ3 | 0.20 | −0.26 | 0.23 | 0.22 | 0 | 1.60 | 0.07 | Největší levá příbalová informace |
ƒ4 | −0.15 | 0.28 | 0.26 | 0.24 | 0 | 0.44 | 0.07 | Největší pravý leták |
Ty odpovídají následujícím transformacím:
Počítačová generace
![]() | Tato část je věcná přesnost je sporný.Květen 2020) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Ačkoli Barnsleyovu kapradinu lze teoreticky vykreslit ručně perem a milimetrovým papírem, počet potřebných iterací se pohybuje v řádu desítek tisíc, což činí počítač prakticky povinným. Mnoho různých počítačových modelů Barnsleyovy kapradiny je oblíbené u současných matematiků. Pokud je matematika správně naprogramována pomocí Barnsleyho matice konstant, bude vytvořen stejný tvar kapradiny.
První nakreslený bod je na počátku (X0 = 0, y0 = 0) a pak se nové body iterativně vypočítají náhodným použitím jedné z následujících čtyř transformací souřadnic:[4][5]
ƒ1
- Xn + 1 = 0
- yn + 1 = 0.16 yn.
Tato transformace souřadnic je zvolena 1% času a pouze mapuje jakýkoli bod do bodu v prvním úsečkovém segmentu na základně stonku. Tato část obrázku je první, která má být dokončena v průběhu iterací.
ƒ2
- Xn + 1 = 0.85 Xn + 0.04 yn
- yn + 1 = −0.04 Xn + 0.85 yn + 1.6.
Tato transformace souřadnic je vybrána na 85% času a mapuje jakýkoli bod uvnitř letáku představovaný červeným trojúhelníkem na bod uvnitř protějšího, menšího letáku představovaného modrým trojúhelníkem na obrázku.
ƒ3
- Xn + 1 = 0.2 Xn − 0.26 yn
- yn + 1 = 0.23 Xn + 0.22 yn + 1.6.
Tato transformace souřadnic je vybrána 7% času a mapuje jakýkoli bod uvnitř letáku (nebo boltce) představovaný modrým trojúhelníkem do bodu uvnitř střídavého odpovídajícího trojúhelníku přes stopku (převrátí jej).
ƒ4
- Xn + 1 = −0.15 Xn + 0.28 yn
- yn + 1 = 0.26 Xn + 0.24 yn + 0.44.
Tato transformace souřadnic je vybrána 7% času a mapuje jakýkoli bod uvnitř letáku (nebo boltce) představovaný modrým trojúhelníkem do bodu uvnitř střídavého odpovídajícího trojúhelníku přes stopku (aniž by jej překlopil).
První transformace souřadnic táhne stopku. Druhý generuje po sobě jdoucí kopie stonku a spodních listů, které tvoří úplnou kapradinu. Třetí kreslí spodní vějířovitý obraz vlevo. Čtvrtý nakreslí spodní vějířovitý list vpravo. Rekurzivní povaha IFS zaručuje, že celek je větší replikou každého lístku. Všimněte si, že celá kapradina je v rozmezí −2,1820 <X <2,6558 a 0 ≤y < 9.9983.
Mutantní odrůdy
Hrou s koeficienty je možné vytvořit mutantní odrůdy kapradin. Ve své práci o V-variabilních fraktálech Barnsley nazývá tuto vlastnost a superfraktální.[2]
Jeden experimentátor přišel s tabulkou koeficientů, aby vytvořil další pozoruhodně přirozeně vypadající kapradinu, která se podobá Cyclosorus nebo Thelypteridaceae kapradina. Tyto jsou:[6][7]
w | A | b | C | d | E | F | p |
---|---|---|---|---|---|---|---|
ƒ1 | 0 | 0 | 0 | 0.25 | 0 | −0.4 | 0.02 |
ƒ2 | 0.95 | 0.005 | −0.005 | 0.93 | −0.002 | 0.5 | 0.84 |
ƒ3 | 0.035 | −0.2 | 0.16 | 0.04 | −0.09 | 0.02 | 0.07 |
ƒ4 | −0.04 | 0.2 | 0.16 | 0.04 | 0.083 | 0.12 | 0.07 |
Příklady syntaxe
Pomocí níže uvedené syntaxe můžete kapradinu nakreslit sami.
Krajta
import želvaimport náhodnýpero = želva.Želva()pero.Rychlost(15)pero.barva("modrý")pero.penup()X = 0y = 0pro n v rozsah(110000): pero.jít do(65 * X, 37 * y - 252) # 57 je měřítko kapradiny a -275 má začít kresbu zespodu. pero.pendown() pero.tečka() pero.penup() r = náhodný.náhodný() # pro získání pravděpodobnosti r = r * 100 xn = X yn = y -li r < 1: # elif žebřík na základě pravděpodobnosti X = 0 y = 0.16 * yn elif r < 86: X = 0.85 * xn + 0.04 * yn y = -0.04 * xn + 0.85 * yn + 1.6 elif r < 93: X = 0.20 * xn - 0.26 * yn y = 0.23 * xn + 0.22 * yn + 1.6 jiný: X = -0.15 * xn + 0.28 * yn y = 0.26 * xn + 0.24 * yn + 0.44
R
# Barnsley's Fern# vytvoří funkci pravděpodobnosti a aktuálního bodufractal_fern2 <- funkce(X, p){ -li (p <= 0.01) { m <- matice(C(0, 0, 0, .16), 2, 2) F <- C(0, 0) } jiný -li (p <= 0.86) { m <- matice(C(.85, -.04, .04, .85), 2, 2) F <- C(0, 1.6) } jiný -li (p <= 0.93) { m <- matice(C(.2, .23, -.26, .22), 2, 2) F <- C(0, 1.6) } jiný { m <- matice(C(-.15, .26, .28, .24), 2, 2) F <- C(0, .44) } m %*% X + F}# kolik opakování určuje, jak detailní bude kapradinaopakování <- 10000# vytvořit vektor s hodnotami pravděpodobnosti a matici pro uložení souřadnicp <- runif(opakování)# inicializovat bod na počátkucoords <- C(0, 0)# vypočítat fraktální souřadnicem <- Snížit(fractal_fern2, p, akumulovat = T, inic = coords)m <- t(do.call(cbind, m))# Vytvořit spiknutíspiknutí(m, typ = „p“, cex = 0.1, plk = "tmavozelený", xlim = C(-3, 3), ylim = C(0, 10), xlab = NA, ylab = NA, sekery = NEPRAVDIVÉ)
zpracovává se
/* Barnsley Fern pro zpracování 3.4*/// deklarace proměnných xayplovák X, y;// vytváření plátnaprázdnota založit() { velikost(600, 600); Pozadí(255);}/ * nastavení tahu, mapovací plátno a poté vykreslování bodů * /prázdnota DrawPoint() { mrtvice(34, 139, 34); zdvih Váha(1); plovák px = mapa(X, -2.1820, 2.6558, 0, šířka); plovák py = mapa(y, 0, 9.9983, výška, 0); směřovat(px, py);}/ * algoritmus pro výpočet hodnoty (n + 1) tis termín x a y na základě transformace matice * /prázdnota nextPoint() { plovák nextX, dalšíY; plovák r = náhodný(1); -li (r < 0.01) { nextX = 0; dalšíY = 0.16 * y; } jiný -li (r < 0.86) { nextX = 0.85 * X + 0.04 * y; dalšíY = -0.04 * X + 0.85 * y + 1.6; } jiný -li (r < 0.93) { nextX = 0.20 * X - 0.26 * y; dalšíY = 0.23 * X + 0.22 * y + 1.6; } jiný { nextX = -0.15 * X + 0.28 * y; dalšíY = 0.26 * X + 0.24 * y + 0.44; } X = nextX; y = dalšíY;}/ * iterace vykreslování a výpočtu funkce přes smyčku * /prázdnota kreslit() { pro (int i = 0; i < 100; i++) { DrawPoint(); nextPoint(); }}
P5.JS
nechat X = 0;nechat y = 0;funkce založit() { createCanvas(600, 600); Pozadí(0);}// rozsah −2,1820 funkce DrawPoint() { mrtvice(255); zdvih Váha(1); nechat px = mapa(X, -2.1820, 2.6558, 0, šířka); nechat py = mapa(y, 0, 9.9983, výška, 0); směřovat(px, py);}funkce nextPoint() { nechat nextX; nechat dalšíY; nechat r = náhodný(1); -li (r < 0.01) { //1 nextX = 0; dalšíY = 0.16 * y; } jiný -li (r < 0.86) { //2 nextX = 0.85 * X + 0.04 * y; dalšíY = -0.04 * X + 0.85 * y + 1.60; } jiný -li (r < 0.93) { //3 nextX = 0.20 * X + -0.26 * y; dalšíY = 0.23 * X + 0.22 * y + 1.60; } jiný { //4 nextX = -0.15 * X + 0.28 * y; dalšíY = 0.26 * X + 0.24 * y + 0.44; } X = nextX; y = dalšíY;}funkce kreslit() { pro (nechat i = 0; i < 1000; i++) { DrawPoint(); nextPoint(); }}
JavaScript (HTML5)
<plátno id="plátno" výška="700" šířka="700"></plátno><skript> nechat plátno; nechat canvasContext; nechat X = 0, y = 0; okno.onload = funkce () { plátno = dokument.getElementById("plátno"); canvasContext = plátno.getContext('2d'); canvasContext.fillStyle = "Černá"; canvasContext.fillRect(0, 0, plátno.šířka, plátno.výška); setInterval(() => { // Aktualizace 20krát každý snímek pro (nechat i = 0; i < 20; i++) Aktualizace(); }, 1000/250); // 250 snímků za sekundu }; funkce Aktualizace() { nechat nextX, dalšíY; nechat r = Matematika.náhodný(); -li (r < 0.01) { nextX = 0; dalšíY = 0.16 * y; } jiný -li (r < 0.86) { nextX = 0.85 * X + 0.04 * y; dalšíY = -0.04 * X + 0.85 * y + 1.6; } jiný -li (r < 0.93) { nextX = 0.20 * X - 0.26 * y; dalšíY = 0.23 * X + 0.22 * y + 1.6; } jiný { nextX = -0.15 * X + 0.28 * y; dalšíY = 0.26 * X + 0.24 * y + 0.44; } // Škálování a umístění nechat plotX = plátno.šířka * (X + 3) / 6; nechat spiknutíY = plátno.výška - plátno.výška * ((y + 2) / 14); drawFilledCircle(plotX, spiknutíY, 1, "zelená"); X = nextX; y = dalšíY; } konst drawFilledCircle = (centrumX, centrumY, poloměr, barva) => { canvasContext.beginPath(); canvasContext.fillStyle = barva; canvasContext.oblouk(centrumX, centrumY, poloměr, 0, 2 * Matematika.PI, skutečný); canvasContext.vyplnit(); };</skript>
QZákladní
OBRAZOVKA12OKNO(-5,0)-(5,10)NÁHODNĚČASOVAČBARVA10DĚLATVYBERTE PŘÍPADRNDPŘÍPADJE<.01nextX=0dalšíY=.16*yPŘÍPAD.01NA.08nextX=.2*X-.26*ydalšíY=.23*X+.22*y+1.6PŘÍPAD.08NA.15nextX=-.15*X+.28*ydalšíY=.26*X+.24*y+.44PŘÍPADJINÝnextX=.85*X+.04*ydalšíY=-.04*X+.85*y+1.6KONECVYBRATX=nextXy=dalšíYPSET(X,y)SMYČKADOKUDINKEY $=CHR $(27)
VBA (CorelDraw)
SubBarnsley()ZtlumitkonecTak jakoDlouhoZtlumitiTak jakoDlouhoZtlumitXTak jakoDvojnásobekZtlumityTak jakoDvojnásobekZtlumitnextXTak jakoDvojnásobekZtlumitdalšíYTak jakoDvojnásobekZtlumitsShapeArray()Tak jakoTvarZtlumitdVelikostTak jakoDvojnásobekZtlumitsColorTak jakoTětivadVelikost=0.01"Velikost teček."sColor="0,0,100"„Barva RGB bodů, rozsah hodnot 0 až 255konec=5000"Počet iterací."ReDimsShapeArray(konec)„V Corelu vyžaduje každý nakreslený objekt vlastní název proměnnéNáhodně„Inicializujte funkci RndProi=0Nakonec' Opakovat ...VybratPřípadRndPřípadJe<0.01'f1 = Nakreslete stopkunextX=0dalšíY=0.16*yPřípad0.01Na0.08„f3nextX=0.2*X-0.26*ydalšíY=0.23*X+0.22*y+1.6Případ0.08Na0.15„f4nextX=-0.15*X+0.28*ydalšíY=0.26*X+0.24*y+0.44PřípadJiný„f2nextX=0.85*X+0.04*ydalšíY=-0.04*X+0.85*y+1.6KonecVybratX=nextXy=dalšíYSouborsShapeArray(i)=Aktivní vrstva.CreateEllipse2(X+2.5,y+0.5,dVelikost)sShapeArray(i).Styl.StringAssign"{" "fill" ": {" "primaryColor" ":" "RGB255, USER,"&sColor&", 100,00000000-0000-0000-0000-000000000000" "," "secondaryColor" ":" "RGB255, USER, 255,255,255,100,00000000-0000-0000-0000-000000000000" "," "typ" ":" " 1 "", "" fillName "": null}, "" outline "": {"" width "": "" 0 "", "" color "": "" RGB255, USER, 0,0,0,100, 00000000-0000-0000-0000-000000000000 ""}, "" průhlednost "": {}} "UdálostidalšíKonecSub
Amola
1přidat balíček("Forms.dll") 2 3soubor("x", 0) 4soubor("y", 0) 5soubor("šířka", 600) 6soubor(„výška“, 600) 7 8metoda založit() 9 createCanvas(šířka, výška)10 přímý(0, 0, 600, 600, barva(0, 0, 0))11konec1213metoda DrawPoint()14 soubor("curX", div (mult (šířka, přidání (x, 3)), 6))15 soubor("curY", sub (height, mult (height, div (add (y, 2), 14))))16 soubor("velikost", 1)17 //log(curX)18 //log(curY)19 přímý(kolo(curX - velikost / 2), kolo(curY - velikost / 2), kolo(curX + velikost / 2), kolo(curY + velikost / 2), barva(34, 139, 34))20konec2122metoda nextPoint()23 soubor("nextX", 0)24 soubor("nextY", 0)25 soubor("random", random (0, 100))26 -li(náhodný < 1)27 soubor("nextX", 0)28 soubor(„nextY“, 0,16 * y)29 konec30 jiný31 -li(náhodný < 86)32 soubor(„nextX“, 0,85 * x + 0,04 * y)33 soubor(„nextY“, -0,04 * x + 0,85 * y + 1,6)34 konec35 jiný36 -li(náhodný < 93)37 soubor(„nextX“, 0,2 * x - 0,26 * y)38 soubor(„nextY“, 0,23 * x + 0,22 * y + 1,6)39 konec40 jiný41 soubor(„nextX“, -0,15 * x + 0,28 * y)42 soubor(„nextY“, 0,26 * x + 0,24 * y + 0,44)43 konec44 konec45 konec4647 soubor(„x“, nextX)48 soubor("y", dalšíY)49konec5051založit()52zatímco(skutečný)53 DrawPoint()54 nextPoint()55konec
TSQL
/ * tabulka výsledků * /prohlásit @kapradina stůl (Zábava int, X plovák, Y plovák, Sekv int identita(1,1) hlavní klíč, Datum přidáno čas schůzky výchozí dostat datum())prohlásit @i int = 1 / * interace * /prohlásit @zábava int / * náhodná funkce * /prohlásit @X plovák = 0 / * inicializovat X = 0 * /prohlásit @y plovák = 0 / * inicializovat Y = 0 * /prohlásit @rand plovákvložit do @kapradina (Zábava, X, Y) hodnoty (0,0,0) / * nastavit výchozí bod * /zatímco @i < 5000 / * kolik bodů? * /začít soubor @rand = rand() vybrat @Zábava = případ / * získejte náhodnou funkci - @fun = f1 = 1%, f2 = 85%, f3 = 7%, f4 = 7% * / když @rand <= 0.01 pak 1 když @rand <= 0.86 pak 2 když @rand <= 0.93 pak 3 když @rand <= 1 pak 4 konec vybrat horní 1 @X = X, @Y = Y z @kapradina objednat podle Sekv popis / * získejte předchozí bod * / vložit do @kapradina(Zábava, X, Y) / * transformace pomocí čtyř různých výrazů funkcí * / vybrat @zábava, případ @zábava když 1 pak 0 když 2 pak 0.85*@X+0.04*@y když 3 pak 0.2*@X-0.26*@y když 4 pak -0.15*@X + 0.28*@y konec X, případ @zábava když 1 pak 0.16*@y když 2 pak -0.04*@X + 0.85*@y + 1.6 když 3 pak 0.23*@X + 0.22*@y + 1.6 když 4 pak 0.26*@X + 0.24*@y + 0.44 konec Y soubor @i=@i+1konecvybrat horní 5000 *,zeměpis::Směřovat(Y, X, 4326) z @kapradina objednat podle newid()
MATLAB
AI = [0 0 ; 0 0.16];AII = [ 0.85 0.04 ; -0.04 0.85 ] ;AIII = [ 0.2 -0.26 ; 0.23 0.22 ] ;AIV = [-0.15 0.28 ; 0.26 0.24 ];BI = [ 0 ; 0];BII = [ 0 ; 1.6];BIII = [ 0 ; 1.6];BIV = [0 ; 0.44];N = 100000;H = nuly(N,2);X = 0;y = 0;T = [X;y];pro i = 2 : N p = rand; -li p < 0.01 % disp („schéma 1“) S1 = AI*T + BI; X = S1(1); y = S1(2); elseif p < 0.85 % disp („schéma 2“) S2 = AII*T + BII; X = S2(1); y = S2(2); elseif p < 0.93 % disp („schéma 3“) S3 = AIII*T + BII; X = S3(1); y = S3(2); jiný % disp („schéma 4“) S4 = AIV*T + BIV; X = S4(1); y = S4(2); konec %%Aktualizace T T = [X;y]; H(i,1) = X; H(i,2) = y;konecX = H(:,1);Y = H(:,2);spiknutí(X,Y,'.', 'Barva', [79, 121, 66]/256, 'markersize', 0.1)
Reference
- ^ A b Fraktály všude, Boston, MA: Academic Press, 1993, ISBN 0-12-079062-9
- ^ A b Michael Barnsley, et al.,""Fraktály a superfraktály s proměnnými V"" (PDF). (2,22 MB)
- ^ Fraktály všude, tabulka III.3, kód IFS pro kapradinu.
- ^ Barnsley, Michael (2000). Fraktály všude. Morgan Kaufmann. str. 86. ISBN 0-12-079069-6. Citováno 2010-01-07.
- ^ Weisstein, Eric. „Barnsley's Fern“. Citováno 2010-01-07.
- ^ Jiné odrůdy kapradin s dodanými koeficienty, vyvoláno 2010-1-7
- ^ Generátor kapradiny Barnsley