spiral

by arcm111

HTML

<canvas id="canvas" width="300" height="300" >Not supported</canvas>
<input id="slider1" type="range" min="0" max="10" step="0.5" value="5" oninput="anim()" />
<input id="slider2" type="range" min="0" max="1" step="0.01" value="0.1" oninput="anim()" />

CSS

canvas
{
	border: 2px solid darkslateblue;
	background: white;
	display: block;
}
input
{
	display: block;
	margin-top: 10px;
}

JavaScript

var innerRadius = 0;
var innerDistance = 3;
var center = {'x': 150, 'y': 150};
var c = document.getElementById ('canvas');
var ctx = c.getContext ("2d");

function spiral (angle)
{
	var r = innerRadius + innerDistance * angle;
	var y = r * Math.sin (angle) + center.y;
	var x = r * Math.cos (angle) + center.x;
	return [x, y];
}

function draw()
{
	ctx.beginPath();              
	ctx.lineWidth = "2";
	ctx.strokeStyle = "steelblue";
	ctx.clearRect (0, 0, 300, 300);
	var pt = spiral (0);
	ctx.moveTo (pt[0], pt[1]);
	for (var i = 0; i < 360 * 4; i += 5)
	{
		var pt = spiral (i * Math.PI / 180);
		ctx.lineTo (pt[0], pt[1]);
	}
	ctx.stroke();
}

var prev = 0;
function animate (now)
{
	if (now - prev > 20)
	{
		innerDistance += 0.1;
		draw();
		prev = now;
	}
	if (innerDistance < 60) window.requestAnimationFrame (animate);
}

var randA = 12;
var randB = 0.06;
function lspiral (angle, a, b)
{
	var r = a * Math.pow (Math.E, b * angle);
	var x = r * Math.cos (angle) + 150;
	var y = r * Math.sin (angle) + 150;
	return [x, y];
}

var s1 = document.getElementById ("slider1");
var s2 = document.getElementById ("slider2");
function draw2()
{
	ctx.beginPath();              
	ctx.lineWidth = "2";
	ctx.strokeStyle = "steelblue";
	ctx.clearRect (0, 0, 300, 300);
	var pt = lspiral (0, s1.value, s2.value);
	ctx.moveTo (pt[0], pt[1]);
	for (var i = 0; i < 360 * 4; i += 5)
	{
		var pt = lspiral (i * Math.PI / 180, s1.value, s2.value);
		ctx.lineTo (pt[0], pt[1]);
	}
	ctx.stroke();
}

function anim()
{
	window.requestAnimationFrame (draw2);
}

draw2();