Recursive construction of a Sierpinski triangle by using the HTML5 canvas element and JavaScript
A Sierpinski triangle is a fractal named after the Polish mathematician Wacław Sierpiński. This demo shows how to construct a Sierpinski triangle by using JavaScript and the HTML5 canvas element. You can interactively modify the recursion depth between 0 and 10. Have a look at the Wikipedia article for further information.
Recursion depth:
JavaScript source code
/*
* Copyright 2012-2013 by Steffen A. Jakob (http://www.jakob.at/)
* All rights reserved.
*/
// Constructor which initializes the canvas widget
function Sierpinski() {
this.w = 600;
// Compute the height of the canvas to let an equilateral triangle
// fit into it. Pythagoras is your friend here.
this.h = Math.sqrt(3) / 2 * this.w;
this.canvas = document.getElementById("canvas");
this.context = this.canvas.getContext("2d");
this.maxDepth = 10;
this.canvas.width = this.w;
this.canvas.height = this.h;
}
// Draw a Sierpinski Triangle with the given recursion depth
Sierpinski.prototype.drawSierpinskiTriangle = function(depth)
{
this.context.clearRect(0, 0, this.w, this.h);
// Initialize the coordinates of an equilateral triangle which
// fits into the canvas
var x0 = 0, y0 = this.h - 1;
var x1 = this.w, y1 = this.h - 1;
var x2 = this.w/2, y2 = 0;
// Draw the initial triangle (black)
this.context.fillStyle = "#000000";
this.drawTriangle(x0, y0, x1, y1, x2, y2);
// Remove the triangle (draw white) which is defined by the
// midpoints of the sides of the initial triangle. Recursively
// execute this process for the remaining 3 triangles.
this.context.fillStyle = "#ffffff";
if (depth > this.maxDepth) { // make sure that depth doesn't get too high
depth = this.maxDepth;
document.getElementById('depthStepper').value = depth;
}
this.removeCenterTriangle(x0, y0, x1, y1, x2, y2, depth);
};
// Draw a filled triangle which is defined by the points
// (x0,y0), (x1,y1), and (x2,y2)
Sierpinski.prototype.drawTriangle = function(x0, y0, x1, y1, x2, y2) {
this.context.beginPath();
this.context.moveTo(x0, y0);
this.context.lineTo(x1, y1);
this.context.lineTo(x2, y2);
this.context.lineTo(x0, y0);
this.context.fill();
};
// Removes the center triangle which is defined by connecting the midpoints
// of each side.
Sierpinski.prototype.removeCenterTriangle = function(x0, y0, x1, y1, x2, y2, depth) {
if (depth > 0) {
// Midpoint coordinates
var x01 = (x0 + x1)/2, y01 = (y0 + y1)/2;
var x02 = (x0 + x2)/2, y02 = (y0 + y2)/2;
var x12 = (x1 + x2)/2, y12 = (y1 + y2)/2;
// Remove the center triangle
this.drawTriangle(x01, y01, x02, y02, x12, y12);
if (depth > 1) {
// Recursively remove center triangles for the
// remaining filled triangles
this.removeCenterTriangle(x0, y0, x01, y01, x02, y02, depth - 1);
this.removeCenterTriangle(x01, y01, x1, y1, x12, y12, depth - 1);
this.removeCenterTriangle(x02, y02, x12, y12, x2, y2, depth - 1);
}
}
};