
// MengerSponge.java
// Robert Sedgewick and Kevin Wayne
// Slightly reformatted by Andrew Davison, Nov. 2022

// https://introcs.cs.princeton.edu/java/23recursion/MengerSponge.java.html

/* Plot a Menger sponge of order n.

   Usage:
     > compile MengerSponge.java
     > run MengerSponge n
   e.g.
     > run MengerSponge 4
*/


public class MengerSponge
{

  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.out.println("Usage: run MengerSponge <size>");
      return;
    }
    int n = Integer.parseInt(args[0]);

    StdDraw.clear(StdDraw.BLACK);
    StdDraw.setPenColor(StdDraw.WHITE);
    draw(n, 0.5, 0.5, 1);
    System.out.println("Drawing finished");
  }  // end of main()


  private static void draw(int n, double x, double y, double size)
  // plot an order n Menger sponge, centered on (x, y) of the given size
  {
    if (n == 0) 
      return;
    StdDraw.filledSquare(x, y, size/6);

    // compute x- and y-coordinates
    double x0 = x-size/3;
    double x1 = x+size/3;
    double y0 = y-size/3;
    double y1 = y+size/3;

    // recursively draw 4 half-size Menger sponges of order n-1
    draw(n-1, x0, y0, size/3);  // lower left
    draw(n-1, x0, y, size/3);   // mid left
    draw(n-1, x0, y1, size/3);  // upper left

    draw(n-1, x, y0, size/3);   // lower mid
    draw(n-1, x, y1, size/3);   // upper mid

    draw(n-1, x1, y0, size/3);  // lower right
    draw(n-1, x1, y, size/3);   // mid right
    draw(n-1, x1, y1, size/3);  // upper right
  }  // end of draw()


}  // end of MengerSponge class
