Automata
Automata
Automata
Automata
Automata
Automata
Automata
Automata
Automata
Experimental generation of image data using a discrete model of computation, simulating cell structures, randomization, applied aesthetics, taste.
Experimental generation of image data using a discrete model of computation, simulating cell structures, randomization, applied aesthetics, taste.
Experimental generation of image data using a discrete model of computation, simulating cell structures, randomization, applied aesthetics, taste.
Experimental generation of image data using a discrete model of computation, simulating cell structures, randomization, applied aesthetics, taste.
Experimental generation of image data using a discrete model of computation, simulating cell structures, randomization, applied aesthetics, taste.
Using C4 to generate these images I produced more than 900 series and curated the best 6 styles into this project.
Using C4 to generate these images I produced more than 900 series and curated the best 6 styles into this project.
Using C4 to generate these images I produced more than 900 series and curated the best 6 styles into this project.
Using C4 to generate these images I produced more than 900 series and curated the best 6 styles into this project.
Using C4 to generate these images I produced more than 900 series and curated the best 6 styles into this project.
9000+ 4K images
7.5GB generated data
I looked at every single image
9000+ 4K images
7.5GB generated data
I looked at every single image
Best viewed on a 4K screen
9000+ 4K images
7.5GB generated data
I looked at every single image
Best viewed on a 4K screen
9000+ 4K images
7.5GB generated data
I looked at every single image
Best viewed on a 4K screen
Click on an image below to see the full series
9000+ 4K images
7.5GB generated data
I looked at every single image
Best viewed on a 4K screen
Click an image below to see the full series
Click an image below to see the full series
Click an image below to see the full series
Click an image below to see the full series
Click an image below to see the full series
func createSeriesImage(rules: [Bool], map oldMap: [Bool]) -> Image {
// Create a mutable copy of the input map
var newMap = createMap(from: oldMap)
// Generate global noise for this iteration
var noiseCount = generateNoiseCount()
// Iterate over each row, starting with the second
for row in 1...h {
// Generate per-row allowable noise
var rowNoise = calculateAllowableNoise()
// Iterate over each pixel
for col in 1..<w-1 {
// Compute the index of the pixel row above
let idx = (row - 1) * w + (col - 1)
// Determine the bit pattern based on the three pixels above
var result = 0b000000
if newMap[idx] { result |= 0b000100 }
if newMap[idx + 1] { result |= 0b000010 }
if newMap[idx + 2] { result |= 0b000001 }
// Determine the new pixel value, possibly applying noise
let newValue = shouldApplyNoise() ? !rules[result] : rules[result]
newMap[row * w + col] = newValue
}
}
// Convert boolean map to an array of pixels
let pixels = newMap.map { $0 ? foregroundColor : backgroundColor }
// Return the generated image
return Image(pixels: pixels, size: Size(w, h))
}
// Iterate over each row, starting with the second
for row in 1...h {
// Generate per-row allowable noise
var rowNoise = calculateAllowableNoise()
// Iterate over each pixel
for col in 1..<w-1 {
// Compute the index of the pixel row above
let idx = (row - 1) * w + (col - 1)
// Determine the bit pattern
// based on the three pixels above
var res = 0b000000
if newMap[idx] { result |= 0b000100 }
if newMap[idx + 1] { result |= 0b000010 }
if newMap[idx + 2] { result |= 0b000001 }
// Determine the new pixel value
// possibly applying noise
let newValue = applyNoise ? !rules[res] : rules[res]
newMap[row * w + col] = newValue
}
}
func createSeriesImage(rules: [Bool], map oldMap: [Bool]) -> Image {
// Create a mutable copy of the input map
var newMap = createMap(from: oldMap)
// Generate global noise for this iteration
var noiseCount = generateNoiseCount()
// Iterate over each row, starting with the second
for row in 1...h {
// Generate per-row allowable noise
var rowNoise = calculateAllowableNoise()
// Iterate over each pixel
for col in 1..<w-1 {
// Compute the index of the pixel row above
let idx = (row - 1) * w + (col - 1)
// Determine the bit pattern based on the three pixels above
var result = 0b000000
if newMap[idx] { result |= 0b000100 }
if newMap[idx + 1] { result |= 0b000010 }
if newMap[idx + 2] { result |= 0b000001 }
// Determine the new pixel value, possibly applying noise
let newValue = shouldApplyNoise() ? !rules[result] : rules[result]
newMap[row * w + col] = newValue
}
}
// Convert boolean map to an array of pixels
let pixels = newMap.map { $0 ? foregroundColor : backgroundColor }
// Return the generated image
return Image(pixels: pixels, size: Size(w, h))
}
// Iterate over each row, starting with the second
for row in 1...h {
// Generate per-row allowable noise
var rowNoise = calculateAllowableNoise()
// Iterate over each pixel
for col in 1..<w-1 {
// Compute the index of the pixel row above
let idx = (row - 1) * w + (col - 1)
// Determine the bit pattern
// based on the three pixels above
var res = 0b000000
if newMap[idx] { result |= 0b000100 }
if newMap[idx + 1] { result |= 0b000010 }
if newMap[idx + 2] { result |= 0b000001 }
// Determine the new pixel value
// possibly applying noise
let newValue = applyNoise ? !rules[res] : rules[res]
newMap[row * w + col] = newValue
}
}