160c Schotter
Based on Schotter by Georg Nees (23 June 1926 - 3 January 2016)
(meta linear-colour-space: 1)
(render-background)
(render-main)
(define
num-squares-to-render 25 ~ (gen/int min: 14 max: 40)
gap-size 2 ~ (gen/int min: 0 max: 10)
num-squares (+ 2 num-squares-to-render)
num-gaps (+ num-squares 1)
square-size (/ (- canvas/width (* gap-size num-gaps)) num-squares)
focal-point (focal/build-hline ~ (gen/select from: '(focal/build-point
focal/build-hline
focal/build-vline))
position: [500 ~ (gen/select from: '(0 500 1000))
0 ~ (gen/select from: '(0 500 1000))]
distance: 1300 ~ (gen/scalar min: 300 max: 1300))
rng-fn (prng/build min: -1 max: 1 seed: 454)
box-colour (col/rgb r: 0.2 g: 0.2 b: 0.2 alpha: 0.7))
(fn (stroked-box seed: 0
volatility: 0)
(define
half-size+ (/ square-size 2)
half-size- (* half-size+ -1)
thickness 1.2 ~ (gen/scalar min: 0.9 max: 3.0)
half-thickness (/ thickness 2))
(on-matrix-stack
;; displace the box according to volatility
(rotate angle: (* (prng/value from: rng-fn) volatility 135.923 ~ (gen/scalar min: 0 max: 200)))
(translate vector: [(* (prng/value from: rng-fn) volatility 1.826 ~ (gen/scalar min: 0 max: 100))
(* (prng/value from: rng-fn) volatility 29.980 ~ (gen/scalar min: 0 max: 100))])
;; draw a box around the origin
(line from: [(+ half-size- half-thickness) half-size-]
to: [(- half-size+ half-thickness) half-size-]
width: thickness
colour: box-colour)
(line from: [half-size+ (- half-size- half-thickness)]
to: [half-size+ (+ half-size+ half-thickness)]
width: thickness
colour: box-colour)
(line from: [(- half-size+ half-thickness) half-size+]
to: [(+ half-size- half-thickness) half-size+]
width: thickness
colour: box-colour)
(line from: [half-size- (+ half-size+ half-thickness)]
to: [half-size- (- half-size- half-thickness)]
width: thickness
colour: box-colour)))
(fn (map-to-position at: 0)
(- (+ (* (+ gap-size square-size) at) (/ square-size 2) gap-size)
(/ canvas/height 2)))
(fn (render-main)
(define
x-sub 7 ~ (gen/int min: 1 max: 8)
y-sub 1 ~ (gen/int min: 1 max: 8))
(on-matrix-stack
(translate vector: [(/ canvas/width 2) (/ canvas/height 2)])
(loop (y from: y-sub to: (- num-squares y-sub))
(loop (x from: x-sub to: (- num-squares x-sub))
(define
position [(map-to-position at: x) (map-to-position at: y)])
(on-matrix-stack
(translate vector: position)
(stroked-box seed: (+ x (* y num-squares))
volatility: (focal/value from: focal-point position: position)))))))
(fn (render-background colour: (col/rgb r: 1 g: 1 b: 0.9))
(rect position: [(/ canvas/width 2) (/ canvas/height 2)]
width: canvas/width
height: canvas/height
colour: colour))