var CIRCLE = 0; var SQUARE_SHAPE = 1; var points = []; var currentAngle = 0; var drawing = false; var shapes = [CIRCLE, CIRCLE]; var radii = [107, 17]; var shapeNameList = ['circle', 'square']; var speed = 0.5; function removeElementById(id) { (function(x){x.parentNode.removeChild(x);})(document.getElementById(id)); } function getNumShapes() { var i = 0; do { var x = document.getElementById("rt"+i); i++; } while (x != null); return i-1; } function deleteShape(num) { removeElementById("rt"+num); removeElementById("st"+num); removeElementById("shape"+num); removeElementById("radius"+num); removeElementById("del"+num); removeElementById("br"+num); } function updateShapes() { shapes = []; radii = []; var nShapes = getNumShapes(); for (var i = 0; i < nShapes; i++) { var sel = document.getElementById("shape" + i); var val = sel.options[sel.selectedIndex].value; shapes.push(shapeNameList.indexOf(val)); radii.push(document.getElementById("radius" + i).value); } speed = parseFloat(document.getElementById("speed").value); } function loadShapes() { var nShapes = getNumShapes(); for (var i = 0; i < nShapes; i++) { var sel = document.getElementById("shape" + i); sel.selectedIndex = shapes[i]; document.getElementById("radius" + i).value = radii[i]; } document.getElementById("speed").value = speed; } function addShape() { updateShapes(); var nShapes = getNumShapes(); var shapesDiv = document.getElementById("shapes"); shapesDiv.innerHTML += 'Radius: Shape: ' + '
'; shapes.push(0); radii.push(50); loadShapes(); } function startDrawing() { drawing = true; points = []; updateShapes(); } function squine(angle) { angle %= TWO_PI; if (angle >= QUARTER_PI && angle <= 3*QUARTER_PI) return 1; if (angle >= 5*QUARTER_PI && angle <= 7*QUARTER_PI) return -1; if (angle > 7*QUARTER_PI || angle < QUARTER_PI) return map((angle+QUARTER_PI)%TWO_PI-QUARTER_PI, -QUARTER_PI, QUARTER_PI, -1, 1); return -map(angle, 3*QUARTER_PI, 5*QUARTER_PI, -1, 1); } function squos(angle) { if (angle >= 7*QUARTER_PI || angle <= QUARTER_PI) return 1; if (angle >= 3*QUARTER_PI && angle <= 5*QUARTER_PI) return -1; if (angle > QUARTER_PI && angle < 3*QUARTER_PI) return -map(angle, QUARTER_PI, 3*QUARTER_PI, -1, 1); return map(angle, 5*QUARTER_PI, 7*QUARTER_PI, -1, 1); } function getPointOnShape(shape, radius, centerX, centerY, angle) { if (shape == SQUARE_SHAPE) return [radius*squos(angle)+centerX, radius*squine(angle)+centerY]; else if (shape == CIRCLE) return [radius*cos(angle)+centerX, radius*sin(angle)+centerY]; } function setup() { createCanvas(700, 700).parent("canvasSpot"); ellipseMode(CENTER); } function draw() { updateShapes(); try{ if (drawing) { background(255); stroke(0); noFill(); var centerX = width/2; var centerY = height/2; var nextPoint; for (var i = 0; i < shapes.length; i++) { var angle = map(currentAngle%radii[i], 0, radii[i], 0, TWO_PI); nextPoint = getPointOnShape(shapes[i], radii[i], centerX, centerY, angle); centerX = nextPoint[0]; centerY = nextPoint[1]; } points.push([centerX, centerY]); if (points.length != 1 && dist(points[0][0], points[0][1], points[points.length-1][0], points[points.length-1][1]) < speed) drawing = false; for (var i = 1; i < points.length; i++) { line(points[i-1][0], points[i-1][1], points[i][0], points[i][1]); } currentAngle += speed; if (drawing) { noStroke(); fill(255, 0, 0); ellipse(centerX, centerY, 7, 7); } }}catch(e){document.write(e + "
");} }