如何在Canvas中识别形状?

时间:2012-03-22 12:51:18

标签: html5 html5-canvas html5-animation

如果我定义一个画布并在其上绘制几个形状,那么我如何精确定位每个形状或图像,以便在每个形状上声明事件和其他属性。考虑我有一个矩形和一个三角形。我可以有一些机制,以便将它们定义为特定实体,我可以单独处理它们。我知道KineticJS,但我想自己实现这个功能(用于学习目的)。任何人都可以找到实现它的方法。或者可能是一种算法方法??

2 个答案:

答案 0 :(得分:6)

我想用鼠标事件解释精确定位

首先,你必须实现一个获取鼠标位置的方法

    function getMousePos(canvas, evt){
    // get canvas position
    var obj = canvas;
    wrapper = document.getElementById('wrapper');
    var top = 0;
    var left = 0;
    while (obj && obj.tagName != 'BODY') {
        top += obj.offsetTop;
        left += obj.offsetLeft;
        obj = obj.offsetParent;
    }

    // return relative mouse position
    var mouseX = evt.clientX - left + window.pageXOffset+wrapper.scrollLeft;
    var mouseY = evt.clientY - top + window.pageYOffset+wrapper.scrollTop;
    return {
        x: mouseX,
        y: mouseY
    };
}
  1. 矩形
  2. 说,我们有一个矩形,其值为x1,y1,w,h

    $(canvas).mousemove(function(e){
    
            //Now call the method getMousePos
             var mouseX, mouseY;
             var mousePos = getMousePos(canvas, e);
             mouseX=mousePos.x;
             mouseY=mousePos.y; 
    
            // check if move on the rect
    
            if(mouseX>x1 && mouseX<x1+w && mouseY>y1 && mouseY<y1+h)
            {
                alert('mouse on rect')
            }        
    });
    
    1. 说,我们有一个圆圈,其值为x,y,r

      $(canvas).mousemove(function(e){
      
              //Now call the method getMousePos
               var mouseX, mouseY;
               var mousePos = getMousePos(canvas, e);
               mouseX=mousePos.x;
               mouseY=mousePos.y; 
      
              // check if move on the rect
      
             if(Math.pow(mouseX-x,2)+Math.pow(mouseY-y,2)<Math.pow(r,2))
              {
                  alert('mouse on circle')
              }        
      });
      

      通过这种方式,我们可以精确定位画布对象

答案 1 :(得分:1)

无法使用DOM中的任何现有功能。所以你必须自己写。你可以从制作这样的对象模型开始:

function Shape(x, y) {
  var obj = {};
  obj.x = x;
  obj.y = y;

  obj.paint = function(canvasTarget) {
  }

  return obj;
}

function Rectangle(x, y, width, height) {
  var obj = Shape(x, y);
  obj.width = width;
  obj.height = height;

  obj.paint = function(canvasTarget) {
     //paint rectangle on the canvas
  }

  return obj;
}

function Canvas(target) {
  var obj = {};
  obj.target = target
  obj.shapes = [];

  obj.paint = function() {
     //loop through shapes and call paint
  }

  obj.addShape(shape) {
     this.shapes.push(shape);
  }        
}

制作对象模型后,您可以使用它来绘制如下形状:

var cnv = new Canvas();
cnv.addShape(new Rectangle(10,10,100,100));
cnv.paint();

然后,您可以在画布上处理onclick事件,并确定单击哪个形状。