Source: http://aqualonne.free.fr/Teaching/csc/Patterns.pdf