#!/usr/bin/ruby
#
## https://rosettacode.org/wiki/Kronecker_product_based_fractals
#
func kronecker_product (a, b) { [a,b].cartesian.map_2d {|a,b| a ~X* b } }
func kronecker_fractal(pattern, order=4) {
var kronecker = pattern
{ kronecker = kronecker_product(kronecker, pattern) } * order
return kronecker
}
var order = 5
var shape = [[1, 1, 1], [0, 1, 0], [0, 1, 0]]
require("Imager")
var pat = kronecker_fractal(shape, order)
var img = %O<Imager>.new(xsize => pat[0].len, ysize => pat.len)
var c1 = %n<255 255 32>
var c2 = %n<16 16 16>
for y in (^pat.len), x in (^pat[0].len) {
img.setpixel(x => x, y => y, color => (pat[y][x] ? c1 : c2))
}
img.write(file => "kronecker_fractal.png")