gpt4 book ai didi

javascript - 如何在 Canvas 中制作选择框以选择它接触的任何对象而不仅仅是它所包含的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:02 24 4
gpt4 key购买 nike

有一个很棒的教程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);
}
}

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

P.S:这是一个有效的 jsbin .

最佳答案

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

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

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

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

间隔,我指的是单一维度。当然,您必须测试 xy 的条件。请注意,第二个条件是第一个条件,它们的右侧交换了。

对于您的示例,将 HitTest 更改为:

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

关于javascript - 如何在 Canvas 中制作选择框以选择它接触的任何对象而不仅仅是它所包含的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35316667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com