Recursive graphics: The Sierpinski Triangle

The Sierpinski triangle is a very nice example of a recursive pattern (fractal). It was described by the mathematician Sierpinski in 1915. Although it looks complex, it can be generated with a very short recursive method.

First, let's try to understand the recursion.

Do you see the pattern? Imagine that you have a method called

//draws a black-filled triangle with vertices (x1, y1), (x2,y2), (x3,y3)
drawFilledTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
When drawFilledTriangle(a1, a2, b1, b2, c1, c2) is called, it draws for you on the screen a black-filled triangle with the specified vertices (a1,a2), (b1,b2), (c1,c2). Using it, try to sketch down the code for a method that draws the Sierpinski triangle with vertices (x1, y1), (x2,y2), (x3,y3):
//draws a Sierpinski triangle with vertices (x1, y1), (x2, y2), (x3, y3)
render(int x1, int y1, int x2, int y2, int x3, int y3, int depth) {

    ...
}

FractalDriver.java
Sierpinski.java