In this series of blog post I explore tiling with different shapes, starting with simple grids and circular patterns with single shapes, then exploring more complex combinations of shapes.

The tool I'm using to explore these patterns is Racket Stamps, which runs on the Racket language. Download both for free by following these links.

### What's a Context Free Grammar?

From Wikipedia a CFG is: "a set of production rules that describe all possible [compositions] in a given language... production rules are simple replacements."

So a CFG allows you to represent drawings by simple shape compositions, for example this Racket Stamps code draws an infinite line of circles by defining

So a CFG allows you to represent drawings by simple shape compositions, for example this Racket Stamps code draws an infinite line of circles by defining

*circles*as a*circle*followed by*circles*to the left:
#lang s-exp stamps/lang

;; Comments:

(define-shape circles ;; define circles to be:

;; Comments:

(define-shape circles ;; define circles to be:

(circle) ;; a circle

(circles [x 1])) ;; followed by circles to the left

If you run that in Racket Stamps (and do check out the tutorial first) you'll see that the line is actually not infinite, just very long. We can control how far the rendering runs, and therefore how many shapes are drawn using the setting maximum-render-cycles -- you'll see this in the examples below.

### Tiling a plane

So we can draw a line, but how would we fill a 2D space? The first method to try is to make a grid of shapes. A

*grid*is a*line*of shapes, with a*grid*placed above it, which is a*line*of shapes with a*grid*placed above it... thanks to recursion we can fill the space, here's the code:
#lang s-exp stamps/lang

(define-shape line-of-circles

(circle)

(line-of-circles [x 1]))

(define-shape grid

(line-of-circles)

(grid [y 1]))

(maximum-render-cycles 1000)

(start-shape grid)

Because of the way the rendering works (and in particular how the maximum-render-cycles setting works), we actually get a triangle of circles! But we can crop into a square, so code like the above works well to help us explore patterns. Try this by adding this setting to the above example:

(bounding '(-16 -12 -1 0.50))

### Making adjustments

Do you see those xs and ys in the examples above, enclosed in square brackets? They adjust the position of shapes so that we don't draw everything on top of each other. There are lots of other adjustments you can use, try out the following:

*rotate*(or r) by a number of degrees*scale*(or s) by a factor, 1 is same size, .9 is 10% smaller, 1.1 is 10% bigger*shear*by a factor between -1 and +1, 0 is no shear*hue*(or h) change colour by degrees on the colour wheel*saturation*(or sat) between 0 and 1*brightness*(or b) between 0 and 1*alpha*(or a) between 0 and 1

*grid*to the following:

(define-shape grid

(line-of-circles [sat 1] [b 1]) ;; Full saturation and brightness

(grid [y 1]

[hue 10] ;; Move through the colour wheel by 10 degrees

))

## No comments:

## Post a Comment