【问题标题】:Canvas Drawing Application. Rotating Drawing画布绘图应用程序。旋转绘图
【发布时间】:2015-10-27 10:24:37
【问题描述】:

我正在制作画布绘图应用程序,我想实现绘图的旋转。但是当我旋转它并想继续绘制时,鼠标光标并没有指向正在绘制的像素。 我该如何解决? 这是我的代码:

    <button id="rotate">rotate right</button>



    var clickX = new Array();
    var clickY = new Array();
    var clickDrag = new Array();
    var paint = false;
    var context = null;
    var canvas = null;
    canvas = document.getElementById('drawing');
    context = canvas.getContext('2d');

    rotate.onclick = function() { 

        context.translate(400,0);
        context.rotate(90*Math.PI/180);                 
        draw();
    }

    canvas.onmousedown = function(e){
        paint = true;           
        addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop,false);                    
        draw();

    }
    canvas.onmousemove = function(e){


    if(paint){  

        addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true);            
        draw();

        }
    canvas.onmouseup = function(){
      paint = false;
    }

   function addClick(x, y, dragging)
    { 


      clickX.push(x);
      clickY.push(y);
      clickDrag.push(dragging);       


    }

    function redraw(){
      context.clearRect(0, 0, 400, 400);
      context.lineJoin = "round";
      // usunieto context.lineWidth = 5;

      for(var i=0; i < clickX.length; i++)
      {     



        context.beginPath();
        if(clickDrag[i]){

          context.moveTo(clickX[i-1], clickY[i-1]);
         }else{
           context.moveTo(clickX[i], clickY[i]);
         }
         context.lineTo(clickX[i], clickY[i]);
         context.closePath();            
         context.stroke();
         }


      }


    }

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    对画布应用变换保持画布状态。您需要保存画布状态,应用转换,绘制,然后恢复画布状态。 2D 上下文 API 提供 ctx.save() 和 ctx.restore() 为您执行此操作。它使用堆栈来保存状态,这意味着可以嵌套保存,但必须使用匹配的恢复来删除每个保存;

    ctx.save();  // push the current state onto the save stack
    ctx.rotate(Math.PI/2); // rotate 90deg clockwise
    // call your draw function
    ctx.restore();  // pop the last saved state from the save stack
    

    这应该可以解决你的问题。

    【讨论】:

    • 在这里使用.save 和.restore 是多余的——保存和恢复整个上下文状态。只需执行ctx.rotate(-Math.PI/2); 即可撤消轮换。
    • ctx.rotate 涉及创建一个完整的矩阵,然后进行乘法运算。为了速度,只需用单位矩阵ctx.setTransform(1,0,0,1,0,0) 替换现有矩阵,您还可以通过ctx.currentTransform 获得当前变换,其属性a, b, c, d, e, and f 表示变换a,b' x axis c,d` y 轴和e,f 的3 个向量起源。
    • 当然。在这个更简单的应用程序中重置整个转换矩阵并没有什么坏处。但请记住,您也吹走了所有当前的转换。在更复杂的应用程序中,您可能需要通过使用 ctx.rotate(-Math.PI/2) 反转本地 .rotate 来保留其他一些转换。
    • 最好的方法是在绘制之后保持画布状态不变。在一个复杂的应用程序中,您永远无法确定下一次抽奖需要什么状态,那么为什么要恢复一个可能不需要的状态。
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多