Iterált függvény rendszerek

Két végrehajtási iterált függvény rendszer

Iterált függvény rendszer (CIF, Iterált funkciók rendszer) - ez egy lehetőség, hogy megszerezze fraktál struktúrák.
A legegyszerűbb CIF áll affin transzformációk a gépet. (Emlékezzünk, hogy a affin transzformáció a koordináta - általában szuperpozíciója méretezés, forgatás, párhuzamos fordítás és tükrözés).
Az általános affin transzformáció a sík adott a következő egyenletek:

X „= A * X + B * Y + E
Y „= C * X + D * Y + F

A számú egyenlet eléréséhez alkalmazott fraktál szerkezet, legalább két. Így fraktál rács (. Háló, 1. ábra) figyelembe következő négy rendszerek:

(1, az kiválasztásának valószínűségét 0,25)
X „= 0,3 * X - 0,3 * Y + 1
Y „= 0,3 * X + 0,3 * Y + 1

(2, 0,25 kiválasztási valószínűséget)
X „= 0,3 * X - 0,3 * Y + 1
Y „= 0,3 * X + 0,3 * Y - 1

(3, a kiválasztásának valószínűségét 0,25)
X „= 0,3 * X - 0,3 * Y - 1
Y „= 0,3 * X + 0,3 * Y + 1

(4, 0,25 kiválasztási valószínűséget)
X „= 0,3 * X - 0,3 * Y - 1
Y „= 0,3 * X + 0,3 * Y - 1

Ábra. 1. Fractal grill (beépített bittérképes képként)

Mindegyik rendszer neve CIF átalakulás.
A NRF alkalmazott összenyomható affin transzformáció, azaz azok, amelyekben a skálázási tényező kisebb, mint egység.

Egy algoritmust építi a CIF-fraktál:

  1. Keressen és festeni a kiindulási pont (X, Y) kép (kezdőpontját a keresési algoritmus lásd alább).
  2. Választás, egy ismert kiválasztásának valószínűségét egy CIF-transzformációk, hogy megtalálják a koordináták (X „Y”) egy új képet pont és festeni a megtalált ponton.
  3. Vegyük X = X 'és Y = Y'.
  4. Ismételje meg A 2. és 3., előre meghatározott számú alkalommal az algoritmus.

A kiindulási vehet minden tulajdonában pontja egy képet. Az alábbi kiindulási pont kereső algoritmus ad neki választás az úgynevezett attraktor. azaz a területen tartozó kép egy fraktál. Minden ezt követő pontokat talált a fenti algoritmus építi a CIF-fraktál, vándorolni az attraktor, nem mozog a területen, nem tartoznak a képet.

A keresési algoritmus kiindulási pont:

  1. Mark tetszőleges pont (X, Y) a gépen.
  2. Jelölje, egy ismert kiválasztásának valószínűségét egy CIF-transzformáció, és megtalálja a koordináták (X „Y”) a következő pontot.
  3. Vegyük X = X 'és Y = Y'.
  4. Ismételje meg 2. és 3. az algoritmus egy előre meghatározott számú alkalommal (például 100).
  5. Mark, mint egy kiindulási pont az utolsó pont.

Figyelembe véve az egyes CIF konverziós külön-külön, akkor látható, hogy függetlenül attól, hogy a helyzet a kiinduló pont után több iteráció pont nem mozog. megállási pont az úgynevezett fix pont.
A fix pont átalakítás minden egyes részének a attraktor. Ezért a kiindulási pont az építési fraktál vehet egy fix pontot, például először átalakítani.
CIF felírható tömörebben az alábbi táblázat tartalmazza:

Az utolsó oszlopban az egyes CIF-átalakítás jelzi a kiválasztási valószínűséget, amikor keresi a következő pont a fraktál kép.
A példában, ezeket a valószínűségeket egyenlő, amely azonban nem jellemző.

A következő kód biztosítja a kimeneti ábrán látható. 1 fraktál rács.

globális IFS, XP, YP ifsCnt
globális xi, yi, xA, YA
-- Kiszámítja egy pont koordinátáit kép fraktál
-- X és Y paraméterek átadása hivatkozás
fn affin col x y = (
t = x * col [1] + y * col [2] + col [5]
y = x * col [3] + y * col [4] + col [6]
X = t
)
-- Megkeresi a kiindulási pont a kép
fn sPoint = (
-- Vegyük az első CIF-átalakítás
col = k = 1-től 6 gyűjteni IFS [k]
-- Miután 100 iteráció XP és YP - a koordinátáit a kiindulási pont
k = 1-től 100 do affin col xP YP
)
-- Kiválasztja a véletlen szám és az kiválasztásának valószínűségét az érzékelő,
-- CIF átalakítás koordinátáinak kiszámításához a következő pont kép
fn findK12 K11 K22 = (
-- Kap egy véletlen szám tartományban 0,0-1,0
r = véletlenszerű 0,0 1,0
p = 0.0
-- j2 - a sorok számát a táblázatban transzformációk NRF
j2 = ifsCnt / 7
J3 = j2 - 1
j = 1-től J3 Do (
p + = IFS [7 * j]
ha r <= p then (j2 = j; exit)
)
-- Indexek kezdetét és végét a kiválasztott sor a táblázat CIF átalakítások
K11 = 7 * (j2 - 1) + 1
K22 = K11 + 5
)
-- Rájön fraktál határ kép, és meghatározza egy adott portot e határokon belül
-- Továbbá, ezek a határok használják a képméret
-- és átalakítási koordinálja a jelenlegi pont
fn fConv nPAll = (
helyi K1, K2
xA = yA = -1e3
xi = yi = 1e3
sPoint ()
k = 1-től nPAll do (
findK12 k1 k2
col = m = k1 a k2 gyűjteni IFS [m]
affin col xP YP
xA = amax # (xP, xA); Y a = amax # (Yp, yA)
xi = Amin # (xP, xi); yi = Amin # (Yp, yi)
)
viewport.ZoomToBounds hamis [xi, 0, Yi] [xA, 0, yA]
)
-- Generál fraktál kép pontok nPAll
fn showFrctB = (
-- Egy sor négy CIF-preorazovany meghatározva a fraktál rács
-- Táblázat tükrözi CIF-preorazovany
IFS # = (0,3, -0.3, 0,3, 0,3, 1, 1, 0,25,
0.3, -0.3, 0,3, 0,3, 1, -1, 0,25,
0.3, -0.3, 0,3, 0,3, 1, 1, 0,25,
0.3, -0.3, 0,3, 0,3, -1, -1, 0,25)
ifsCnt = ifs.Count
-- nPAll - a pontok száma a képen a fraktál
nPAll = 10000
xP = Yp = 1,0
fConv nPAll
BSZ = 200
-- Hozzon létre egy bitmap kép 200 * 200 pixel méretű
btmp = bitmap BSZ BSZ színe: fehér
-- Az együtthatók átalakításához koordináta pont a kép
-- A kép illik a megadott bitkép
c = 0,8
cx = c * BSZ / (xA - xi)
CY = c * BSZ / (YA - il)
d = 0,5 * (1,0 - c) * BSZ
clr = színes 0 0 255
K1 = k2 = 0
-- NPAll szerezni képpontok
-- és rögzítse őket formájában kék pixel a raszteres kép btmp
-- Az eredete a raszteres kép bal felső sarkában
k = 1-től nPAll do (
-- Kiválasztása CIF átalakítás
findK12 k1 k2
col = m = k1 a k2 gyűjteni IFS [m]
-- Mi található a egy pont koordinátáit a képen
affin col xP YP
xb = d + cx * (Xp - xi)
Yb = BSZ - (d + cy * (YP - il))
setPixels btmp [xb, yb] # (CLR)
)
-- Mutatja az eredményeket (lásd. Ábra. 1)
megjelenítéséhez btmp
)
showFrctB ()

Run lefut a 3ds Max az alábbi sorrendben:

Más képek elegendő a tömb IFS más alkalmas adatok. Ezek az adatok nyerhetők a kódot az alvízi szakaszon „Collection Particle Flow-fraktálok”. Például, ha egy sor adatok alapján határozza meg az IFS 8. rajz

IFS = # (0.824074, 0.281482, -0,212346, 0,864198, -1,882290, -0,110607, 0,787473,
0.088272, 0.520988, -0,463889, -0,377778, 0,785360, 8,095795, 0,212527)

A program létrehoz egy bitmap kép a fraktál sárkány (ábra. 2).

Ábra. 2. cseréje után ifs tömb

A formáció a fraktál CIF-részecske részecskeáramlás vannak további lehetőségek kezelésére képeket, így részecskeáramlás rendelkezésre álló forrásokat.
A következő a kódot-generáló NRF kereszt alakú szemcsék elrendezésének (ábra. 3).

Ábra. 3. A fraktál rács (beépített részecskék)

Eltérően az előző kiviteli alak következtetés végezzük folytassa-processzor operátor script_Operator részecskeáramlás rendszer részecskéknek azt a ViewPort-ba. Ez határozza meg a helyzet az újonnan létrehozott részecskék. Helyezze a régi részecske változatlan marad.
Kód, mint abban az esetben, bitkép, a fentiek alapján algoritmusok építi a CIF képet.

globális IFS nPPrev, XP, YP ifsCnt
-- előkészítő szakaszban
függvény tSttngs = (
törlése $ *
viewport.SetLayout # layout_4
viewport.ActiveViewport = 2
viewport.SetType #view_front
2 hamis viewport.SetGridVisibility
sliderTime = 0f
animationRange = intervallum 0f 50f
timeConfiguration.RealTimePlayback = false
timeConfiguration.PlaybackLoop = false
)
globális IFS, XP, YP ifsCnt
globális xi, yi, xA, YA
-- Kiszámítja egy pont koordinátáit kép fraktál
-- X és Y paraméterek átadása hivatkozás
fn affin col x y = (
t = x * col [1] + y * col [2] + col [5]
y = x * col [3] + y * col [4] + col [6]
X = t
)
-- Megkeresi a kiindulási pont a kép
fn sPoint = (
-- Vegyük az első CIF-átalakítás
col = k = 1-től 6 gyűjteni IFS [k]
-- Miután 100 iteráció XP és YP - a koordinátáit a kiindulási pont
k = 1-től 100 do affin col xP YP
)
-- Kiválasztja a véletlen szám és az kiválasztásának valószínűségét az érzékelő,
-- CIF átalakítás koordinátáinak kiszámításához a következő pont kép
fn findK12 K11 K22 = (
-- Kap egy véletlen szám tartományban 0,0-1,0
r = véletlenszerű 0,0 1,0
p = 0.0
-- j2 - a sorok számát a táblázatban transzformációk NRF
j2 = ifsCnt / 7
J3 = j2 - 1
j = 1-től J3 Do (
p + = IFS [7 * j]
ha r <= p then (j2 = j; exit)
)
-- Indexek kezdetét és végét a kiválasztott sor a táblázat CIF átalakítások
K11 = 7 * (j2 - 1) + 1
K22 = K11 + 5
)
-- Rájön fraktál határ kép, és meghatározza egy adott portot e határokon belül
-- Továbbá, ezek a határok használják a képméret
-- és átalakítási koordinálja a jelenlegi pont
fn fConv nPAll = (
helyi K1, K2
xA = yA = -1e3
xi = yi = 1e3
sPoint ()
k = 1-től nPAll do (
findK12 k1 k2
col = m = k1 a k2 gyűjteni IFS [m]
affin col xP YP
xA = amax # (xP, xA); Y a = amax # (Yp, yA)
xi = Amin # (xP, xi); yi = Amin # (Yp, yi)
)
viewport.ZoomToBounds hamis [xi, 0, Yi] [xA, 0, yA]
)
fn showFrct = (
-- Egy sor négy CIF-preorazovany meghatározva a fraktál rács
-- Táblázat tükrözi CIF-preorazovany
IFS # = (0,3, -0.3, 0,3, 0,3, 1, 1, 0,25,
0.3, -0.3, 0,3, 0,3, 1, -1, 0,25,
0.3, -0.3, 0,3, 0,3, 1, 1, 0,25,
0.3, -0.3, 0,3, 0,3, -1, -1, 0,25)
ifsCnt = ifs.Count
-- nPAll - a pontok száma a képen a fraktál
helyi nPAll = 10000, EMS = 0,8 * 160 * 50
xP = Yp = 1,0
fConv nPAll
nPPrev = 1
-- Hozzon létre egy részecske forrás az üzemeltetők a születés (születés)
-- és megjelenítő (DisplayParticles) részecskék
-- Továbbá, a forrás a részecskék üzemeltető script_Operator,
-- nyújtó koordinátáinak meghatározottsága az újszülött részecskék
pF = PF_Source enable_Particles: true emitter_Type: 0 \
quantity_Viewport: 100 show_Logo: off show_Emitter: off
particleFlow.BeginEdit ()
opBth = születési emit_Start: 0 emit_Stop: EMS összege: nPAll
-- Jelenik meg a nézetablakban port kereszt alakú részecske (type = 2)
opDP = displayParticles szín: kék Típus: 2
opSO = script_Operator proceed_Script: "
-- adatcsatornák
A channelsUsed PFoly do (
pCont.UseTime = true
pCont.UsePosition = true
)
A folytatáshoz PFoly do (
K1 = k2 = 0
nP = pCont.NumParticles ()
-- Paraméter nPPrev célja, hogy csökkentse mellszobor
k = nPPrev NP do (
pCont.ParticleIndex = k
-- Vegyük csak az új részecskék
ha pCont.ParticleNew do (
-- Kiválasztása CIF átalakítás
findK12 k1 k2
col = m = k1 a k2 gyűjteni IFS [m]
-- Találunk a koordinátákat a részecske (a következő pont a képre)
affin col xP YP
pCont.ParticlePosition = [xP, 0, Yp]
)
)
nPPrev = nP
) "
EVN = esemény ()
particleFlow.EndEdit ()
evn.AppendAction opBth
evn.AppendAction opDP
evn.AppendAction opSO
pF.AppendInitialActionList evn
playAnimation ()
)
-- Főzés jelenet
tSttngs ()
-- építeni kép
showFrct ()

Most adjunk hozzá egy színpadon bomba fúj a 10. frame és tört tart 25 képkocka:

pb = PBomb szimmetria: 0 káosz: 10 START_TIME: 10f lasts_For: 25f szilárdság: 0,1

Mert a számviteli hozzá a forrás a részecskék következő nyilatkozatot Force:

opFrc = erő force_Space_Warps: # (pb) hatása: 25

Helyezzük a következő kódsort előtt AppendInitialActionList módszer:

A megfigyelt eredmények ábrán mutatjuk be. 4.

Ábra. 4. lereszeljük a bombát (a 40. frame animáció)

A következő kód épít fraktál tárgyak alapú iterált függvény rendszerek (CIF), és több fraktál Mandelbrot és Julia (ábra. 5 és 6).

Ábra. 5. A beállított Mandelbrot

Ábra. 6. Julia halmazok

Ábra. 7. A párbeszéd vezetője

Ábra. A 8. ábra két részecske felépített CIF-fraktál.

Ábra. 8. CIF-Flake fraktálok és nyíl

A számos kiviteli CIF kép nem korlátozódik ezekre. Ezenkívül bizonyos esetekben lehetőség van arra, hogy a kimeneti sorrendje képpontok korábban meghatározva azok koordinátáit a tömbben. Ezután a tömb lehet válogatni, például Y-koordináta és végre soros kimeneti osztályozott pont. Ez a technika különösen, hogy a „Seasons. Ősz” verseny „élő festészet”, hogy megjelenjen a növekvő fa.

Kapcsolódó cikkek