Skip to content

Instantly share code, notes, and snippets.

@georules
Created December 29, 2015 17:44
Show Gist options
  • Save georules/fe6c9bfc0b46bfb5decc to your computer and use it in GitHub Desktop.
Save georules/fe6c9bfc0b46bfb5decc to your computer and use it in GitHub Desktop.
Art in Pi, Experiment #2
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script src="http://underscorejs.org/underscore-min.js"></script>
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
svg { width: 100%; height: 100%; }
</style>
</head>
<body>
<canvas id='canvas'></canvas>
<script>
var piString = "3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481";
var width = 800;
var height = 800;
var length = 35;
// colors taken from visualcinnamon's original pi art post
var colors = ['#F3C844', '#F1B34B', '#EC6959', '#DD406E', '#C24488',
'#A562A7', '#7B7EBF', '#4EA1B0', '#50BE8D', '#9ECA7D'];
var canvas = document.getElementById('canvas');
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext('2d');
var x = width / 4;
var y = height / 3;
// draw pi
_.each(piString, function(int) {
int = parseInt(int);
if (_.isNaN(int)) return;
ctx.beginPath();
ctx.moveTo(x, y);
var radian = (2 * Math.PI) / 10 * int - (Math.PI / 2);
x += length * Math.cos(radian);
y += length * Math.sin(radian);
ctx.strokeStyle = colors[int];
ctx.lineWidth = 2;
ctx.lineTo(x, y);
ctx.stroke();
ctx.closePath();
});
x = length * 2;
y = length * 2;
// draw legend
_.each([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], function(int) {
var radian = (2 * Math.PI) / 10 * int - (Math.PI / 2);
var x1 = 2 * Math.cos(radian) + x;
var y1 = 2 * Math.sin(radian) + y;
var x2 = length * Math.cos(radian) + x;
var y2 = length * Math.sin(radian) + y;
var textX = (length + 5) * Math.cos(radian) + x;
var textY = (length + 5) * Math.sin(radian) + y;
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.strokeStyle = colors[int];
ctx.lineWidth = 2;
ctx.lineTo(x2, y2);
ctx.stroke();
// all that making text look nice
ctx.font = '12px Helvetica';
ctx.fillStyle = '#666';
if (int > 0 && int < 5) {
ctx.textAlign = 'start';
} else if (int > 5 && int < 10) {
ctx.textAlign = 'end';
} else {
ctx.textAlign = 'center';
}
if (int > 2 && int < 8) {
ctx.textBaseline = 'top';
} else {
ctx.textBaseline = 'bottom';
}
ctx.fillText(int, textX, textY);
ctx.closePath();
});
</script>
</body>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment