4

有一个很棒的教程Selecting Multiple Objects with KineticJS教你如何在 HTML Canvas 中创建一个选择框以选择多个对象,但是作者Michelle Higgins编写了他的代码来选择选择框所包含的对象。

以下 JavaScript 代码表达了该算法:

var pos = rectSel.getAbsolutePosition();

//get the extents of the selection box
var selRecXStart = parseInt(pos.x);
var selRecXEnd = parseInt(pos.x) + parseInt(rectSel.attrs.width);
var selRecYStart = parseInt(pos.y);
var selRecYEnd = parseInt(pos.y) + parseInt(rectSel.attrs.height);

//get the extents of the group to compare to
var grpXStart = parseInt(grp.attrs.x);
var grpXEnd = parseInt(grp.attrs.x) + parseInt(grp.attrs.width);
var grpYStart = parseInt(grp.attrs.y);
var grpYEnd = parseInt(grp.attrs.y) + parseInt(grp.attrs.height);

//Are we inside the selction area?
if ((selRecXStart <= grpXStart && selRecXEnd >= grpXEnd) && 
    (selRecYStart <= grpYStart && selRecYEnd >= grpYEnd))
{
  if (arSelected.indexOf(grp.getName()) < 0)
  {
    arSelected.push(grp.getName());

    var tmpX = parseInt(grp.attrs.x);
    var tmpY = parseInt(grp.attrs.y);

    var rectHighlight = new Kinetic.Rect({
      x: tmpX,
      y: tmpY,
      height: grp.attrs.height,
      width: grp.attrs.width,
      fill: 'transparent',
      name: 'highlightBlock',
      stroke: '#41d6f3',
      strokeWidth: 3
    });

    layer.add(rectHighlight);
  }
}

问题是:如何使选择框不仅选择它所接触的任何对象,还选择它所包含的对象?

PS:这是一个工作jsbin

4

1 回答 1

2

当前方法检查对象是否完全包含在选择矩形中。在以下情况下,一个区间obj完全包含在另一个区间中sel

    sel.start <= obj.start && obj.end <= sel.end

当您只想让对象重叠时,请测试:

    sel.start <= obj.end && obj.start <= sel.end

间隔,我的意思是一个维度。当然,您必须同时测试 和 的x条件y。请注意,第二个条件是第一个交换了右侧的条件。

对于您的示例,将命中测试从:

        //Are we inside the selction area?
        if (selRecXStart <= grpXStart
         && selRecXEnd >= grpXEnd
         && selRecYStart <= grpYStart
         && selRecYEnd >= grpYEnd)
        { ...

至:

        //Are we inside the selction area?
        if (selRecXStart <= grpXEnd
         && selRecXEnd >= grpXStart
         && selRecYStart <= grpYEnd
         && selRecYEnd >= grpYStart)
        { ...
于 2016-02-10T15:29:13.840 回答