Warning!

This page applies to an older version of Orbited (Version 0.5) For info on the current version see the main documentation.


Canvas Shapes Demo


(from this blog post)

Code

<canvas id="shapes" width="400" height="250"></canvas><br>
<input type="button" value="Refresh" id="refresh" onclick="draw();" style="font-size:200%;">
<script>

  var circle = function (context, x, y, radius) {
    var c = context;
    c.beginPath();
    c.arc(x,y,radius,0,Math.PI*2, false);
    c.closePath();
  };


  var regularPolygon = function (context, x, y, radius, angle, sides) {
    var c = context;
    var inner_angle = (2.0 * Math.PI) / sides;
    c.save();
    c.beginPath();
    c.translate(x,y);
    c.rotate(angle);
    c.scale(radius, radius);
    c.moveTo(1,0);
    for (var i=0; i < sides; i++) {
      c.rotate(inner_angle);
      c.lineTo(1,0);
    };
    c.closePath();
    c.restore();
  };

  var regularQuadraticStar = function (context, x, y, radius, angle, sides) {
    var c = context;
    var inner_angle = (2.0 * Math.PI) / sides;
    c.save();
    c.beginPath();
    c.translate(x,y);
    c.rotate(angle);
    c.scale(radius, radius);
    c.moveTo(1,0);
    for (var i=0; i < sides; i++) {
      c.rotate(inner_angle);
      ctx.quadraticCurveTo(0,0,1,0);
    };
    c.closePath();
    c.restore();
  };

  var regularStar = function (context, x, y, radius, angle, sides, pointiness) {
    var c = context;
    var half_inner_angle = (Math.PI) / sides;
    c.save();
    c.beginPath();
    c.translate(x,y);
    c.rotate(angle);
    c.scale(radius, radius);
    c.moveTo(1,0);
    for (var i=0; i < sides; i++) {
      c.rotate(half_inner_angle);
      ctx.lineTo(1 - pointiness, 0);
      c.rotate(half_inner_angle);
      ctx.lineTo(1,0);
    };
    c.closePath();
    c.restore();
  };
  
  var uniform_random = function (low, high) {
    if (typeof(high) === 'undefined') {
      high = low;
      low = 0;
    }
    return low + (high - low) * Math.random();
  };

  var random_int = function (low, high) {
    return Math.floor(uniform_random(low, high));
  }

  var random_choice = function (array) {
    var choice = Math.floor(Math.random() * array.length);
    return array[choice];
  };

  var random_color = function() {
    var r = random_int(30, 256).toString();
    var g = random_int(30, 256).toString();
    var b = random_int(30, 256).toString();
    var a = uniform_random(0.2, 1.0).toString();
    return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + a + ')'
  }

  var randomShape = function (context, width, height, maxradius) {
    context.save()
  
    var minradius = 0.1 * maxradius;
    var minstroke = 0.5;
    var maxstroke = 5.0;
  
    var x = uniform_random(0, width);
    var y = uniform_random(0, height);
    var radius = uniform_random(minradius, maxradius);
    var angle = uniform_random(0.0, 2.0 * Math.PI);
    var sides = random_int(3,9);
    var pointiness = uniform_random(0.3, 0.9);
  
    var shape = random_choice([circle, regularPolygon, regularQuadraticStar, regularStar]);
  
    context.fillStyle = random_color();
    context.strokeStyle = random_color();
    context.lineJoin = random_choice(['round', 'bevel', 'miter']);
    context.miterLimit = 10;
    context.lineWidth = uniform_random(minstroke, maxstroke);
    
    shape(context, x, y, radius, angle, sides, pointiness);
    context.fill();
    shape(context, x, y, radius, angle, sides, pointiness);
    context.stroke();

    context.restore()
  };

  var canvasElement = document.getElementById("shapes");
  var ctx = canvasElement.getContext("2d");
  
  var draw = function () {
    ctx.save();
    ctx.fillStyle = 'rgb(0, 0, 0)';
    ctx.fillRect(0,0,400,250);
    ctx.restore();

    for (var i=0; i < 50; i++) {
      randomShape(ctx, 400, 250, 30);
    };    
  };
  draw();
</script>