Search code examples
javascripthtml5-canvas

Merging two canvas file


Axis helper code :

    const canvas = document.getElementById("canvas");
    const ctx = canvas.getContext("2d");

    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    const AXIS_LENGTH = 50; // Length of the axis lines

    function drawAxis(mouseX, mouseY) {
      ctx.clearRect(0, 0, canvas.width, canvas.height);

      // Draw vertical axis line
      ctx.beginPath();
      ctx.moveTo(mouseX, mouseY - AXIS_LENGTH / 2);
      ctx.lineTo(mouseX, mouseY + AXIS_LENGTH / 2);
      ctx.stroke();

      // Draw horizontal axis line
      ctx.beginPath();
      ctx.moveTo(mouseX - AXIS_LENGTH / 2, mouseY);
      ctx.lineTo(mouseX + AXIS_LENGTH / 2, mouseY);
      ctx.stroke();
    }

    document.addEventListener("mousemove", function (event) {
      const mouseX = event.clientX;
      const mouseY = event.clientY;

      const invertedX = window.innerWidth - mouseX;
      const invertedY = window.innerHeight - mouseY;

      drawAxis(invertedX, invertedY);
    }); 

and

main.js :

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

let isDrawing = false;
let lastX = 0;
let lastY = 0;

canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

function startDrawing(e) {
    isDrawing = true;
    [lastX, lastY] = [canvas.width - (e.pageX - canvas.offsetLeft), canvas.height - (e.pageY - canvas.offsetTop)];
}

function draw(e) {
    if (!isDrawing) return;

    const x = canvas.width - (e.pageX - canvas.offsetLeft);
    const y = canvas.height - (e.pageY - canvas.offsetTop);

    ctx.strokeStyle = 'black';
    ctx.lineWidth = 5;
    ctx.lineCap = 'round';

    ctx.beginPath();
    ctx.moveTo(lastX, lastY);
    ctx.lineTo(x, y);
    ctx.stroke();

    [lastX, lastY] = [x, y];
}

function stopDrawing() {
    isDrawing = false;
}

canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', stopDrawing);
canvas.addEventListener('mouseout', stopDrawing);

canvas.addEventListener('touchstart', (e) => {
    e.preventDefault();
    startDrawing(e.touches[0]);
});

canvas.addEventListener('touchmove', (e) => {
    e.preventDefault();
    draw(e.touches[0]);
});

canvas.addEventListener('touchend', stopDrawing);

function clearCanvas() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

function resizeCanvas() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
}


// Listen for window resize event
window.addEventListener('resize', resizeCanvas);


I want the axis helper to be in the place of inverted mouse coordinates. so when i draw in inverted stroke the axis will work as a guide for where will the stroke appear

I tried directly type the function in my main js file but it did not work. I could see the axis but when I try to draw it becomes wider and the stroke does not appear. OR is there is any way to use 2 canvas elements at the same time with also the index of the elements to be same.


Solution

  • I have combined them. The trick is that one canvas persists the drawing, and the other one clears itself before drawing. Solution? draw everything everytime. I store the [x,y] of mouse positions when drawing, so I can re-draw them every iteration.

    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');
    
    let isDrawing = false;
    let lastX = 0;
    let lastY = 0;
    const AXIS_LENGTH = 50; // Length of the axis lines
    
    // history so we can always redraw
    var points = []
    var allPoints = []
    var invertedX, invertedY
    
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    
    function startDrawing(e) {
      isDrawing = true;
      [lastX, lastY] = [canvas.width - (e.pageX - canvas.offsetLeft), canvas.height - (e.pageY - canvas.offsetTop)];
      points = []
      allPoints.push(points)
      points.push([lastX, lastY])
    
    
    }
    
    function draw(e) {
      if (!isDrawing) return;
    
      const x = canvas.width - (e.pageX - canvas.offsetLeft);
      const y = canvas.height - (e.pageY - canvas.offsetTop);
    
      [lastX, lastY] = [x, y];
      points.push([lastX, lastY])
    
    }
    
    function stopDrawing() {
      isDrawing = false;
    }
    
    
    function clearCanvas() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
    }
    
    function resizeCanvas() {
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;
    }
    
    function drawAllPoints() {
      allPoints.forEach(drawPoints)
    
    }
    
    function drawPoints(points) {
    
      if (points.length) {
        ctx.save()
        ctx.strokeStyle = 'black';
        ctx.lineWidth = 5;
        ctx.lineCap = 'round';
        ctx.beginPath();
        ctx.moveTo(points[0][0], points[0][1]);
        for (var i = 1; i < points.length; i++) {
          ctx.lineTo(points[i][0], points[i][1]);
          ctx.stroke();
    
        }
        ctx.restore()
      }
    }
    
    function drawEverything() {
      clearCanvas()
      drawAxis();
      drawAllPoints()
    
    }
    
    function drawAxis() {
    
      mouseX = invertedX
      mouseY = invertedY
      // Draw vertical axis line
      ctx.save()
      ctx.beginPath();
      ctx.moveTo(mouseX, mouseY - AXIS_LENGTH / 2);
      ctx.lineTo(mouseX, mouseY + AXIS_LENGTH / 2);
      ctx.stroke();
    
      // Draw horizontal axis line
      ctx.beginPath();
      ctx.moveTo(mouseX - AXIS_LENGTH / 2, mouseY);
      ctx.lineTo(mouseX + AXIS_LENGTH / 2, mouseY);
      ctx.stroke();
      ctx.restore()
    }
    
    
    canvas.addEventListener('mousedown', startDrawing);
    canvas.addEventListener('mousemove', draw);
    canvas.addEventListener('mouseup', stopDrawing);
    canvas.addEventListener('mouseout', stopDrawing);
    canvas.addEventListener('touchstart', (e) => {
      e.preventDefault();
      startDrawing(e.touches[0]);
    });
    canvas.addEventListener('touchmove', (e) => {
      e.preventDefault();
      draw(e.touches[0]);
    });
    canvas.addEventListener('touchend', stopDrawing);
    window.addEventListener('resize', resizeCanvas);
    document.addEventListener("mousemove", function(event) {
      const mouseX = event.clientX;
      const mouseY = event.clientY;
    
      invertedX = window.innerWidth - mouseX;
      invertedY = window.innerHeight - mouseY;
    
      drawEverything()
    });
    canvas {
      background: gray;
    }
    <canvas id="canvas"></canvas>