0

私はかなり複雑な図をキャンバスに描いています。(〜1000ポリゴン)。それらすべての再塗装時間は約1秒です(非常に遅い)。次に、ユーザーがその図の上を移動して、マウスの位置の下から垂直線と水平線(十字線)を表示できるようにする必要があります。すべてのポリゴンを越えずにこれらの2本の線だけをペイントし、マウスを動かすたびにすべてを再ペイントするための最良のテクニックは何ですか。

どうも

4

1 に答える 1

0

この答えは壊れています。

下にある絵に触れずに線を引いて動かしたい。古き良き時代には、描画の上にxor構成でペイントし、同じ場所に同じパターン(ここでは線)を同じ方法で描画して、画面から削除する方法が使用されていました。本物の絵。

以下のコードでこのメソッドを使用してテストしようとしましたが、機能しないようです。うまくいけば、canvasとjsの知識が豊富な人が出てきて問題を解決してくれるでしょう。

function onmousemove(e){
  // firt run
  var tcanvas = document.getElementById("testCanvas");
  var tcontext = tcanvas.getContext("2d");
  var pos = {x : e.clientX, y : e.clientY, 
             w : tcanvas.width, h : tcanvas.height };
  var comp = tcontext.globalCompositeOperation;
  var paintline = function (p){
      tcontext.save();

      tcontext.lineWidth = 1;
      tcontext.globalCompositeOperation = 'xor';
      tcontext.fillStyle = "#000000";

      tcontext.moveTo(0,p.y);
      tcontext.lineTo(p.w,p.y);
      tcontext.moveTo(p.x,0);
      tcontext.lineTo(p.x,p.h);
      tcontext.stroke();

      tcontext.restore();
  };

  tcontext.save();
  paintline(pos);
  tcontext.restore();

  var next = function(e){
      var comp = tcontext.globalCompositeOperation;
      paintline(pos);
      pos = {x : e.clientX, y : e.clientY, 
             w : tcanvas.width, h : tcanvas.height };
      paintline(pos);
  };
  document.onmousemove = next;
}


(function draw_stuff(){
    // setup canvas
    var tcanvas = document.getElementById("testCanvas");
    var tcontext = tcanvas.getContext("2d");

    // draw square
    tcontext.fillStyle = "#FF3366";
    tcontext.fillRect(15,15,70,70);

    // set composite property
    tcontext.globalCompositeOperation = 'xor';

    // draw text
    tcontext.fillStyle="#0099FF";
    tcontext.font = "35px sans-serif";
    tcontext.fillText("test", 22, 25);
    // draw circle
    tcontext.fillStyle = "#0099FF";
    tcontext.beginPath();
    tcontext.arc(75,75,35,0,Math.PI*2,true);
    tcontext.fill();
    document.onmousemove = onmousemove; 
})();

また、ブラウザによっては合成に問題があります。

于 2012-12-15T10:30:59.887 に答える