Fabricjs intersectsWithObject возвращает false, когда Object является тканью.Rect

Я пытаюсь определить, когда ткань.Rect перекрывает другую ткань.Rect, наблюдая за событием «object:moving», но имея противоречивые результаты между тканью.Group и тканью.Rect

Когда я перемещаю группу над экземпляром Rect, метод intersectsWithObject возвращает true, но когда я перемещаю экземпляр Rect над другим экземпляром Rect, он возвращает false.

Мне интересно, если я делаю что-то неправильно здесь.

Вот мой обработчик событий

cvs.observe('object:moving', function(e) {

    var targ = e.target;

    // filter out itself
    var items = cvs.getObjects().filter(function(o){
        return targ !== o;
    });

    var hit = false;

    for (var i = 0, n = items.length; i < n; i++) {
        var m = items[i];

        if (targ.type == "group") {
            if (targ.intersectsWithObject(m)) {
                targ.setFill("red");
                hit = true;
                console.log("GROUP HIT");
            } else {
                if (!hit) {
                    targ.setFill("#CCCCCC");
                }
            }
        } 
        else {
            // this is always returning false! why?
            if (targ.intersectsWithObject(m)) {
                var id = m.data ? m.data.entityId : " ??"
                console.log("OBJECT HIT:" + id);
                targ.setFill("red");
            }
        }
    }
});

Я создал скрипку. Попробуйте выбрать два или более блоков, чтобы сгруппировать их. Вы увидите, что сгруппированный объект становится красным, когда его перетаскивают поверх любого другого экземпляра Fabric.Rect или Fabric.Group. Когда вы перетаскиваете один объект Rect поверх другого объекта Fabric.Object любого типа, он никогда не становится красным, поскольку intersectsWithObject всегда возвращает false...

http://jsfiddle.net/cyberpantz/9MkYJ/27/


person cyberpantz    schedule 15.12.2012    source источник


Ответы (1)


Я обнаружил, что явный вызов myObj.setCoords() перед вызовом myObj.intersectsWithObject(otherObj) устраняет проблему.

Я обновил скрипт здесь http://jsfiddle.net/cyberpantz/9MkYJ/29/.

Похоже, что координаты fabric.Rect не обновляются автоматически, пока он перемещается, а координаты Fabric.Group обновляются, хотя я мог бы быть здесь не на базе...

Обновленный (и упрощенный) код

cvs.observe('object:moving', function(e) {

    var targ = e.target;

    // this fixes it
    targ.setCoords();

    var items = cvs.getObjects().filter(function(o){
        return targ !== o;
    });

    var hit = false;

    for (var i = 0, n = items.length; i < n; i++) {
        var m = items[i];

        if (targ.intersectsWithObject(m)) {
            targ.setFill("red");
            hit = true;
        } 
        else {
            if (!hit) {
                targ.setFill("#CCCCCC");
            }
        }
    }
});
person cyberpantz    schedule 18.12.2012
comment
setCoords() делает это, отлично! - person cincplug; 01.12.2016