xxxxxxxxxx
167
/* Draw on the canvas with left click. Each stroke creates a new shape (it is not
* continous). Press space to accelerate the simulation and backspace to
* decimate/erase the most recent shape.
* Squiggle speed sets the speed of the points, Simplify time sets the speed that
* erasing goes at.
*/
// size of the canvas
let canvasWidth = 400;
let canvasHeight = 400;
function setup()
{
createCanvas(canvasWidth, canvasHeight);
}
let mouseHeld = false; //is the mouse held down?
let squiggles = [];
let squiggleSpeed = 0.2; // must be less than 1
let simplifyTimer = 0;
let simplifyTime = 0.5;
let start = true;
function draw()
{
background(0);
stroke(255);
deltaTime = deltaTime / 100; // for some reason its in milliseconds? so i just made it to seconds lol
if (keyIsDown(32))
{
deltaTime *= 10; // accelerate time itself! with a click of the button!
}
//line(0, 0, mouseX, mouseY)
//line(canvasWidth, 0, mouseX, mouseY)
//line(0, canvasHeight, mouseX, mouseY)
//line(canvasWidth, canvasHeight, mouseX, mouseY)
//draw points
if (mouseIsPressed)
{
if (!mouseHeld)
{
mouseHeld = true;
squiggles.push(new squiggle());
}
squiggles[squiggles.length - 1].points.push(new point(mouseX, mouseY));
}
else
{
mouseHeld = false;
}
if (simplifyTimer < simplifyTime)
simplifyTimer += deltaTime;
if (keyIsDown(BACKSPACE))
{
if (squiggles.length > 0 && simplifyTimer >= simplifyTime){
simplifyTimer = 0;
squiggles[squiggles.length - 1] = simplifyLine(squiggles[squiggles.length - 1])
}
}
//display and move each point
for (let i = 0; i < squiggles.length; i ++)
{
if (squiggles[i].points.length == 0)
squiggles.splice(i, 1)
else
{
for (let j = 0; j < squiggles[i].points.length - 1; j ++)
{
//squiggles[i].points[j].x += squiggleSpeed * deltaTime;
//squiggles[i].points[j].y += squiggleSpeed * deltaTime;
let rise = squiggles[i].points[j + 1].y - squiggles[i].points[j].y;
let run = squiggles[i].points[j + 1].x - squiggles[i].points[j].x;
squiggles[i].points[j].x += run * deltaTime * squiggleSpeed;
squiggles[i].points[j].y += rise * deltaTime * squiggleSpeed;
if (squiggles[i].points[j].x > canvasWidth ||
squiggles[i].points[j].x < 0 ||
squiggles[i].points[j].y > canvasHeight ||
squiggles[i].points[j].y < 0)
{
squiggles[i].points.splice(j, 1)
}
else
{
line(squiggles[i].points[j].x, squiggles[i].points[j].y, canvasWidth / 2, canvasHeight / 2);
}
}
if (squiggles[i].points.length > 1)
{
let last = squiggles[i].points.length - 1;
let rise = squiggles[i].points[last].y - squiggles[i].points[0].y;
let run = squiggles[i].points[last].x - squiggles[i].points[0].x;
let distance = sqrt(pow(rise, 2) + pow(run, 2))
if (distance == 0)
distance = 0.0001
squiggles[i].points[last].x += -run * deltaTime * squiggleSpeed * 10 / distance;
squiggles[i].points[last].y += -rise * deltaTime * squiggleSpeed * 10 / distance;
if (squiggles[i].points[last].x > canvasWidth ||
squiggles[i].points[last].x < 0 ||
squiggles[i].points[last].y > canvasHeight ||
squiggles[i].points[last].y < 0)
{
squiggles[i].points.pop();
}
}
}
}
}
function simplifyLine(simplifiedLine)
{
for (let i = 0; i < simplifiedLine.points.length; i ++)
{
if (i%2 == 0)
{
simplifiedLine.points.splice(i, 1);
}
}
return simplifiedLine;
}
class squiggle
{
constructor()
{
this.points = [];
}
}
class point
{
constructor(xInput, yInput)
{
this.x = xInput;
this.y = yInput;
}
}