Arbitrarily-Deep Zooming on Iterated Function Systems by 'Self-Similarity Jumping'
BSc Wiebe-Marten Wijnja
"repeatedly apply the collection of mappings"
iterate
system
(transformation) functions
"repeatedly apply the collection of mappings"
image \(\longrightarrow\) transformed image
image: Set of points
{
}
,
IFS $$ \mathcal{F} = \{ f_i : \mathcal{M} \rightarrow \mathcal{M}\}_{i=1}^N, N \in \mathbb{N}$$(mappings are required to be contractive)
one iteration: $$ \mathcal{S}_{n + 1} = \bigcup_{i=1}^{N} f_i(\mathcal{S}_n), n \in \mathbb{N}$$
Attractor: $$\mathcal{A} = \lim_{n \rightarrow \infty} \mathcal{S}_n$$
(\(\mathcal{S}_0 \) can be an arbitrary non-empty set of points)
IFS $$ \mathcal{F} = \{ f_i : \mathcal{M} \rightarrow \mathcal{M}\}_{i=1}^N, N \in \mathbb{N}$$(mappings are required to be contractive)
one iteration: $$ \mathcal{S}_{n + 1} = \bigcup_{i=1}^{N} f_i(\mathcal{S}_n), n \in \mathbb{N}$$
Attractor: $$\mathcal{A} = \lim_{n \rightarrow \infty} \mathcal{S}_n$$
(\(\mathcal{S}_0 \) can be an arbitrary non-empty set of points)
!!
IFS $$ \mathcal{F} = \{ f_i : \mathcal{M} \rightarrow \mathcal{M}\}_{i=1}^N, N \in \mathbb{N}$$(mappings are required to be contractive)
one iteration: $$ \mathcal{S}_{n + 1} = \bigcup_{i=1}^{N} f_i(\mathcal{S}_n), n \in \mathbb{N}$$
Attractor: $$\mathcal{A} = \lim_{n \rightarrow \infty} \mathcal{S}_n$$
(\(\mathcal{S}_0 \) can be an arbitrary non-empty set of points)
!!
👌
\(t(t(t(\mathcal{S}_0))) \cup t(t(l(\mathcal{S}_0))) \cup \ldots r(r(r(\mathcal{S}_0)))\)
how to find all transformation-sequences?
\(t(t(t(\mathcal{S}_0))) \cup t(t(l(\mathcal{S}_0))) \cup \ldots r(r(r(\mathcal{S}_0)))\)
* There is one cool (but complex) implementation,
c.f. Orion Sky Lawlor. "GPU-accelerated rendering of unbounded nonlinear iterated function system fixed points"
\(t(t(t(\mathcal{S}_0))) \cup t(t(l(\mathcal{S}_0))) \cup \ldots r(r(r(\mathcal{S}_0)))\)
\(t(t(t(l(\mathcal{S}_0)))) \approx t(t(t(r(\mathcal{S}_0)))) \)
[
[
indistinguishable!
\( t(t(t(\ldots)))) \rightarrow r(t(t(t(\ldots))))) \rightarrow t(r(t(t(t(\ldots)))))) \rightarrow l(t(r(t(t(t(\ldots))))))) \) etc.
[
[
[
[
ttt, rtt, trt, ltr, etc.
N: the number of mappings of the IFS;
z: a single arbitrary starting point;
v: the camera's view transformation;
m = 0;
for m ∈ [0..n + P) {
i: a random integer between 0 and N;
if(m >= n){
render(v(z)) cumulatively;
}
z = fᵢ(z);
}
"inside", "outside", "overlapping"
n: the number of mappings the IFS consists of;
v: the current camera's view transformation;
s: a stack of jumps made so far;
for i <- [1, ..., n] {
if isInvertible(fᵢ) and isInside(v⁻¹, fᵢ) {
push(s, fᵢ);
v = fᵢ⁻¹ ◦ v;
break;
}
}
v: the current camera's view transformation;
s: a stack of jumps made until now;
if notEmpty(s) and isOutsideUnitSquare(v⁻¹) {
f = pop(s);
v = f ◦ v;
}
Jump 'up'
Jump 'down'
Cannot be used on 'borders'
Points of single subtransformation visible
Points of multiple subtransformations visible: problem
Both cases are unfortunately rather common
Image Attribution
2D affine transformations (slide 7): Cmglee (https://commons.wikimedia.org/wiki/File:2D_affine_transformation_matrix.svg)
IFS construction (slide 8): Scott Draves (https://en.wikipedia.org/wiki/File:Ifs-construction.png)