Extension 6.5: L-Systems



In this extension we will use Mosaic: a custom API which is ideally suited for the problems below. Unlike with StdDraw where you explicitly pass the x and y locations at which shapes should be drawn, with Mosaic you use the provided methods like above() and beside() to arrange your sub-mosaics. Combining these tools with recursion allows us to create complex recursive shapes with an extraordinarily small amount of code. Watch the videos to see some examples of how to use Mosaic. Then create the three mosaics shown at the bottom in order to demo this extension.

Mosiac API

The Mosaic API is inspired by the Racket Image Library.

Beside Mosaic Example

private static Mosaic sideBySideEllipses() {
        return beside(
                        filledEllipse(0.1, 0.2, HONOLULU_BLUE),
                        filledEllipse(0.1, 0.3, BAMBOO),
                        filledEllipse(0.1, 0.4, BLACK)

Above Mosaic Example

private static Mosaic stackedEllipses() {
        return above(
                        filledEllipse(0.2, 0.1, HONOLULU_BLUE),
                        filledEllipse(0.3, 0.1, BAMBOO),
                        filledEllipse(0.4, 0.1, BLACK)

Overlay Mosaic Example

private static Mosaic overlaidEllipses() {
        return overlay(
                        filledEllipse(0.1, 0.2, HONOLULU_BLUE),
                        filledEllipse(0.2, 0.4, BAMBOO),
                        filledEllipse(0.8, 0.6, BLACK)

Forest Mosaic Example

private static Mosaic tree() {
        return above(
                        filledEquilateralTriangle(1, OCEAN_GREEN),
                        filledRectangle(0.1, 0.2, BAMBOO)

private static Mosaic rowOfTrees() {
        Mosaic tree = tree();
        return beside(tree, tree, tree);

private static Mosaic forest() {
        Mosaic row = rowOfTrees();
        return above(row, row, row);

Recursive Mosaic Example

Note: Mosaic Is Not StdDraw

Warning: use the methods found in Mosaics which are imported for you, not StdDraw to complete this problem.


Implement simple and elegant algorithms to create the three mosaics below. For each problem, analyze the picture and come up with a plan to create it recursively. Questions to ask:

  • What is the base case?

  • What is the recursive substructure?

Sierpinski Gasket


Note: Although it is easy to see solutions to this problem as either:

  • drawing only the black triangles or

  • drawing a single black triangle with upside down white triangles on top

Mosaic currently only supports drawing upright equilateral triangles so you can only reasonably go down the “drawing only the black traingles” path.

Sierpinski Carpet

Note: The PARIS_YELLOW lines you see in the image below are unfortunate artifacts of the StdDraw system. Do NOT attempt to draw them. Depending on your algorithm, they will sadly appear in your simple and elegant solution to this problem.


Cantor Stool

You have attempted of activities on this page