Пересекающиеся пути в Рафаэле - PullRequest
7 голосов
/ 01 мая 2011

Я пытаюсь выяснить, пересекаются ли два пути в Рафаэле. Я попытался getBBox (), но это возвращает координаты окна вокруг самого пути. Есть ли более простой способ добиться этого?

Ответы [ 4 ]

4 голосов
/ 02 августа 2012

Предыдущие ответы, возможно, были для более ранней версии Рафаэля.API теперь включает метод pathIntersection , который возвращает массив пересекающихся точек.Вы можете просто проверить длину возвращаемого значения.

3 голосов
/ 05 мая 2011

Метод грубой силы . Получите все точки для двух путей и посмотрите, совпадают ли две точки.

Я сделал тебя этим , но, может быть, тебе стоит найти лучшее решение для сравнения. В зависимости от того, как долго ваши пути, это может быть тяжелым.

var paper = Raphael(0, 0, '100%', '100%');

var path1 = paper.path("M0 0L100 100");
var path2 = paper.path("M100 0L0 100");

var array1 = new Array();
var array2 = new Array();

for(var i = 0; i < path1.getTotalLength(); i++) {
    array1.push(path1.getPointAtLength(i));
}

for(var i = 0; i < path2.getTotalLength(); i++) {
    array2.push(path2.getPointAtLength(i));
}

for(var i = 0; i < array1.length; i++) {
    for(var k = 0; k < array2.length; k++) {
        // the threshold +-1 is important!
        if(array1[i].x < ( array2[k].x + 1 ) &&
           array1[i].x > ( array2[k].x - 1 )) {
               if(array1[i].y < ( array2[k].y + 1 ) &&
                  array1[i].y > ( array2[k].y - 1 )) {
                   alert('yeah'); // uncomment this. It will alert 4 times.
               } 
        }  
    }
}
2 голосов
/ 01 мая 2011

Полагаю, вам нужно что-то реализовать самостоятельно, так как кажется, что Рафаэль не предоставляет такую ​​функциональность. Вот пример пересечения окружностей , который может помочь. Вот что-то более конкретное .

Перед запуском действующего алгоритма вы, возможно, захотите проверить, пересекаются ли ограничивающие рамки. Если это так, проверьте фактические пути.

1 голос
/ 03 июля 2013

Используйте это прекрасная библиотека пересечения.С этим вы можете делать что-то вроде этого:

var shape1 = new Path(pathElement1),
    shape2 = new Path(pathElement2);

var inter = Intersection.intersectShapes(shape1, shape2);

    if(inter.points.length > 0) {
        // yes they intersect!
    }

Объект inter в моем примере содержит другие полезные вещи.

...