如何在Canvas中创建选择框以选择它触摸的所有对象,而不仅仅是它包含的对象?

马赫迪(Mahdi Alkhatib)

有一个很棒的教程,《使用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

欧姆

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

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

当您只希望对象重叠时,请测试:

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

间隔是指一个维度。你必须,当然,测试双方的条件xy请注意,第二个条件是第一个条件,其右侧已互换。

对于您的示例,将命中测试从以下更改:

        //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)
        { ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

包含参数的组件路径返回所有对象,而不仅仅是一个

来自分类Dev

如何在django中获取相关模型的所有字段而不仅仅是id

来自分类Dev

导入中毒密钥后如何修复GnuPG(而不仅仅是删除它)

来自分类Dev

如何停止和恢复HTML5中的实时音频流而不仅仅是暂停它?

来自分类Dev

获取JavaScript以选择所有元素,而不仅仅是第一个

来自分类Dev

jQuery选择器传递所有实例,而不仅仅是传递事件的那个实例

来自分类Dev

跳过给定类的所有后代(不仅仅是直接子代)的 jQuery 选择器

来自分类Dev

如何在选择查询中使用数据填充外键字段,而不仅仅是外键 ID?

来自分类Dev

LINQ中的更新查询包含WHERE子句中的所有列,而不仅仅是主键列

来自分类Dev

从数据框中删除重复行的所有副本(而不仅仅是重复副本)

来自分类Dev

MS Word中的VBA会影响整个文档,而不仅仅是选择

来自分类Dev

MS Word中的VBA会影响整个文档,而不仅仅是选择

来自分类Dev

我可以扩展.Net中的所有对象(而不仅仅是Winforms控件)以具有标签属性吗?

来自分类Dev

如何从所有div中(不仅仅是同级兄弟)中删除带有jQuery的类?

来自分类Dev

在MongoEngine查询中获取引用对象的数据,而不仅仅是id

来自分类Dev

如何使所有服务实现给定的接口,而不仅仅是活动的接口?

来自分类Dev

如何使所有服务实现给定的接口,而不仅仅是活动的接口?

来自分类Dev

导入运行模块中的所有代码,而不仅仅是导入的功能

来自分类Dev

egrep 输出所有内容,而不仅仅是与列表中的模式匹配的行

来自分类Dev

如何显示所有结果,而不仅仅是代表计算器中的一个

来自分类Dev

如何在整个班级中访问约束,而不仅仅是在我设置的地方?

来自分类Dev

如何在X11上的所有Windows(不仅仅是一个窗口)中监视鼠标移动事件

来自分类Dev

获得的LibreOffice更改所有页面边距,而不仅仅是最后一页选择所有页面是否处于激活状态?

来自分类Dev

查找数据框中所有行的情绪分析,而不仅仅是一行

来自分类Dev

jQuery-让选择器更改所有适当的属性,而不仅仅是找到的第一个属性

来自分类Dev

创建源映射的Gulp任务会影响所有文件,而不仅仅是已更改的文件

来自分类Dev

jQuery .next()选择全部,而不仅仅是下一个

来自分类Dev

崇高-复制多条整行,而不仅仅是选择

来自分类Dev

我可以使用Mockito来部分覆盖现有对象(而不仅仅是测试)吗?

Related 相关文章

  1. 1

    包含参数的组件路径返回所有对象,而不仅仅是一个

  2. 2

    如何在django中获取相关模型的所有字段而不仅仅是id

  3. 3

    导入中毒密钥后如何修复GnuPG(而不仅仅是删除它)

  4. 4

    如何停止和恢复HTML5中的实时音频流而不仅仅是暂停它?

  5. 5

    获取JavaScript以选择所有元素,而不仅仅是第一个

  6. 6

    jQuery选择器传递所有实例,而不仅仅是传递事件的那个实例

  7. 7

    跳过给定类的所有后代(不仅仅是直接子代)的 jQuery 选择器

  8. 8

    如何在选择查询中使用数据填充外键字段,而不仅仅是外键 ID?

  9. 9

    LINQ中的更新查询包含WHERE子句中的所有列,而不仅仅是主键列

  10. 10

    从数据框中删除重复行的所有副本(而不仅仅是重复副本)

  11. 11

    MS Word中的VBA会影响整个文档,而不仅仅是选择

  12. 12

    MS Word中的VBA会影响整个文档,而不仅仅是选择

  13. 13

    我可以扩展.Net中的所有对象(而不仅仅是Winforms控件)以具有标签属性吗?

  14. 14

    如何从所有div中(不仅仅是同级兄弟)中删除带有jQuery的类?

  15. 15

    在MongoEngine查询中获取引用对象的数据,而不仅仅是id

  16. 16

    如何使所有服务实现给定的接口,而不仅仅是活动的接口?

  17. 17

    如何使所有服务实现给定的接口,而不仅仅是活动的接口?

  18. 18

    导入运行模块中的所有代码,而不仅仅是导入的功能

  19. 19

    egrep 输出所有内容,而不仅仅是与列表中的模式匹配的行

  20. 20

    如何显示所有结果,而不仅仅是代表计算器中的一个

  21. 21

    如何在整个班级中访问约束,而不仅仅是在我设置的地方?

  22. 22

    如何在X11上的所有Windows(不仅仅是一个窗口)中监视鼠标移动事件

  23. 23

    获得的LibreOffice更改所有页面边距,而不仅仅是最后一页选择所有页面是否处于激活状态?

  24. 24

    查找数据框中所有行的情绪分析,而不仅仅是一行

  25. 25

    jQuery-让选择器更改所有适当的属性,而不仅仅是找到的第一个属性

  26. 26

    创建源映射的Gulp任务会影响所有文件,而不仅仅是已更改的文件

  27. 27

    jQuery .next()选择全部,而不仅仅是下一个

  28. 28

    崇高-复制多条整行,而不仅仅是选择

  29. 29

    我可以使用Mockito来部分覆盖现有对象(而不仅仅是测试)吗?

热门标签

归档