Art of Structural Reality
Here I tried to give a short explanation of the method that I used to create most of the images on this website.
The world, where we live, and our perception of this world include standard patterns.
Examples of these patterns are: different kinds of symmetry, growth patterns that transform the bud to the shoot, stochastic patterns which are produced by the wind on a smooth surface etc.
There are also perception patterns: perspective, hidden parts of objects, changing of the brightness of the surface with depth.
We can consider these patterns as simple building blocks.
Then these blocks can be linked together to create complex structures and these structures are used to create images.
This approach can be called Structural Reality. It takes patterns that exist in reality and links them together in a relatively random way.
To find structures that produced interesting images we use mutation of the patterns and random splitting and merging pattern structures.
This evolutionary approach makes structures more and more complex. The complex structures have a tendency to create interesting images.
There are different ways to implement this general approach. One of the possible ways is to represent pictures as a complex function Color = F(x,y) and build this function as a superposition of simple functions. We use this method to generate the images that you can see on this website.
This work has two purposes:
Explore the new method of constructing images. It is just like a method of painting and we explore what pictures we can create using this method.
Explore the structure of reality. We combine reality patterns in an uncommon way. What will we get as a result?
The Tree of Functions
We use special trees that represent images.
The tree contains two types of nodes: One Root node and several Functional nodes.
The Root node. The root node is used to transform the scalar value to the color. This node has one child: the Functional node.
This Functional node produces the scalar value s for a particular point of the image (x,y).
Then the Root node transforms this value s to the color vector with red, green and blue components.
Each tree has only one root node;
Example of the simple color function of the root node:
If s<o: s = -s
If s>1: s = 1 / s
return color_1 * s + color_2 * (1-s)
Where color_1 and color_2 are vectors of the red, green and blue components of the color.
Functional nodes. All other nodes of the tree are functional nodes. Each functional node may have zero or more children nodes. Usually there are 0,1,2or 3 children nodes.
Each functional node has correspondent function
x,y - coordinates of the point in the image.
F return scalar float value.
Function F can call children functions one or more times with probably different x and y values.
Functional nodes also may have scalar parameters that can be changed by local mutations
0-children functional node: F(x, y) = sin(a * x) * sin(b * y)
1-child functional node: F(x, y) = F1(x + a * sin(x), y)
2-children functional node: F(x, y) = if(F1(x, y)>0) return F1(x, y); else return F2(x, y);
a, b: parameters
F1, F2: F functions of the child1 and child2.
I use very standard operations to build functions: arithmetic operations, sin, cos, if/else, and pseudorandom functions. Basically I try to keep functional nodes very simple.
Evolutionary Creation of Images
Random Trees Creation
Tree building process first takes one of the Root nodes and then builds the tree of Functional nodes. The process randomly selects nodes from the list, makes a copy of the node and attaches it to the tree.
The tree that produce interesting images usually has 20-300 nodes
We can modify the tree using three types of mutations.
Local mutations: Randomly change the value of parameters of the node. Does not change the structure of the tree. It is possible to regulate the relative scale of parameter changes.
Global mutations: Change the structure of the tree. Randomly select two branches of the tree and make a substitution.
Color Mutations: Randomly select color from the pallet and modify the Root node.
At first the probability of creating trees that produce really interesting images is not high.
If we already have some interesting trees we can significantly increase chances of success.
We can randomly split each tree to the parts and put these parts to the new node list.
Than we can use the same building process to build new trees from the tree parts.
The probability of getting trees that generate interesting images in this case is significantly higher.
This is an evolutionary process where we combine parts of “interesting trees” to create new “interesting trees”.