diff --git a/blog/2024-11-15-playing-with-fire/1-introduction/index.mdx b/blog/2024-11-15-playing-with-fire/1-introduction/index.mdx
index eeb18f9..c9ecc16 100644
--- a/blog/2024-11-15-playing-with-fire/1-introduction/index.mdx
+++ b/blog/2024-11-15-playing-with-fire/1-introduction/index.mdx
@@ -6,6 +6,7 @@ authors: [bspeice]
tags: []
---
+
Wikipedia describes fractal flames fractal flames as:
> a member of the iterated function system class of fractals
@@ -40,18 +41,12 @@ This post covers section 2 of the Fractal Flame Algorithm paper
:::
As mentioned, fractal flames are a type of "[iterated function system](https://en.wikipedia.org/wiki/Iterated_function_system),"
-or IFS. Their mathematical foundations come from a paper written by [John E. Hutchinson](https://maths-people.anu.edu.au/~john/Assets/Research%20Papers/fractals_self-similarity.pdf),
-but reading that paper isn't critical for our purposes. Instead, we'll focus on building a practical understanding
-of how they work. The formula for an IFS is short, but will take some time to unpack:
+or IFS. The formula for an IFS is short, but will take some time to unpack:
$$
S = \bigcup_{i=0}^{n-1} F_i(S)
$$
-TODO: I'm not sure what the intuitive explanation here is. Is the idea that the solution is all points
-produced by applying each function to all points in the solution? And the purpose of the chaos game is
-that if we find one point in the solution set, we can effectively discover all the other points?
-
### Solution set
First, $S$. $S$ is the set of points in two dimensions (in math terms, $S \in \mathbb{R}^2$)
@@ -91,6 +86,7 @@ F_i(a_i \cdot x + b_i \cdot y + c_i, d_i \cdot x + e_i \cdot y + f_i)
$$
import transformSource from "!!raw-loader!../src/transform"
+import CodeBlock from '@theme/CodeBlock'
{transformSource}
@@ -135,35 +131,63 @@ export const shiftData = simpleData.map(({x, y}) => toData(applyCoefs(x, y, coef
Fractal flames use more complex functions, but they all start with this structure.
-
- If you're interested in more math...
-
- TODO: Contractive functions, attractors, etc.?
-
-
### Fixed set
-With those definitions in place, we can try stating the original problem in
-a more natural way:
+With those definitions in place, let's revisit the initial problem:
$$
S = \bigcup_{i=0}^{n-1} F_i(S)
$$
-> The solution, $S$, is the union of all sets produced by applying each function, $F_i$,
+Or, to put it in English, we would get something like this:
+
+> Our solution, $S$, is the union of all sets produced by applying each function, $F_i$,
> to points in the solution.
-There's just one small problem: to solve the equation, we must already know what the solution is?
+There's just one small problem: to find the solution, we must apply these functions to points
+we know are in the solution. But how do we know which points are in the solution to start with?
-TODO: Phrase it another way?
-A point is in the solution if it can be reached by applying
-one of the functions to another point in the solution?
-Is that the definition of a fixed set?
+John E. Hutchinson provides an answer in the [original paper](https://maths-people.anu.edu.au/~john/Assets/Research%20Papers/fractals_self-similarity.pdf)
+explaining the mathematics of iterated function systems:
+
+> Furthermore, $S$ is compact and is the closure of the set of fixed points $s_{i_1...i_p}$
+> of finite compositions $F_{i_1...i_p}$ of members of $F$.
+
+:::note
+I've tweaked the wording slightly to match the conventions in the Fractal Flame paper
+:::
+
+Before your eyes glaze over, let's unpack this explanation:
+
+- **$S$ is [compact](https://en.wikipedia.org/wiki/Compact_space)...**: All points in our solution will be in a finite range
+- **...and is the [closure](https://en.wikipedia.org/wiki/Closure_(mathematics)) of the set of [fixed points](https://en.wikipedia.org/wiki/Fixed_point_(mathematics))**:
+ Applying our functions to these points does not change them
+- **...of finite compositions $F_{i_1...i_p}$ of members of $F$**: By composing our functions (that is,
+ using the output of one function as input to the next function), we will arrive at the points we care about
+
+Thus, by applying the functions in our system to "fixed points," we will find the other points we care about.
+
+However, this is all a bit vague, so let's work through an example.
+
+
+ But if you want a bit more math...
+
+ ...then it's worth mentioning some information I've skipped over.
+
+ First, the Hutchinson paper explains that the functions $F_i$ must be _contractive_ for this result to hold.
+ That is, applying the function to a point must bring it closer to other points. However, as the Fractal Flame
+ algorithm demonstrates, we only need functions to be contractive _on average_. At worst, the system will
+ degenerate and produce a bad image.
+
+ Second, we're focused $\mathbb{R}^2$ because we're generating images, but the Hutchinson paper
+ allows for arbitrary dimensions - which means you could also have 3-dimensional fractal flames.
+
+ TODO: Mention attractors? https://en.wikipedia.org/wiki/Chaos_game
+
## Sierpinski's gasket
-With the math out of the way, we're ready to build our first IFS.
-The Fractal Flame paper provides us three functions we can use for our system:
+The Fractal Flame paper gives us three functions we can use for our function system:
$$
F_0(x, y) = \left({x \over 2}, {y \over 2} \right) \\
@@ -175,9 +199,8 @@ $$
### The chaos game
-import CodeBlock from '@theme/CodeBlock'
-
-Next, how do we find out all the points in $S$? The paper lays out an algorithm called the "chaos game":
+Next, how do we find the "fixed points" we mentioned earlier? The paper lays out an algorithm called the "[chaos game](https://en.wikipedia.org/wiki/Chaos_game)"
+that will give us points in the solution set:
$$
\begin{align*}
@@ -244,8 +267,9 @@ import chaosGameSource from '!!raw-loader!./chaosGame'
-Note: The image here is slightly different than the one in the paper.
-I think the paper has an error, so I'm choosing to plot the image in a way that's consistent with [`flam3` itself](https://github.com/scottdraves/flam3/blob/7fb50c82e90e051f00efcc3123d0e06de26594b2/rect.c#L440-L441).
+The image here is slightly different than the one in the paper.
+I think the paper has an error, so I'm choosing to plot the image
+ in a way that's consistent with [`flam3` itself](https://github.com/scottdraves/flam3/blob/7fb50c82e90e051f00efcc3123d0e06de26594b2/rect.c#L440-L441).
## Weights