2013-07-05 3 views
0

Я ищу самый быстрый способ найти все фигуры внутри области. Пожалуйста, попробуйте этот пример в Chrome или FireFox: http://jsfiddle.net/markusleth/FBjKY/KineticJS и формы внутри области

Я знаю, как перебирать и сравнивать координаты, но меня беспокоит производительность. Любые предложения приветствуются.

var x1, x2, y1, y2; 
var shapes = stage.get("Rect"); 
shapes.each(function (shape) { 
    // calculate if shape is inside x1, x2, y1, y2 
}); 

ответ

2

Ну, KineticJS имеет несколько функций пересечения:

intersects(point)Kinetic.Shape#intersects

getAllIntersections(pos)Kinetic.Container#getAllIntersections

getIntersection(pos)Kinetic.Stage#getIntersection

Хотя getAllIntersections, вероятно, является функцией вам нужно, похоже, автор KineticJS настоятельно рекомендует использовать getIntersectionIF возможно свыше getAllIntersections. Это связано с тем, что getAllIntersections имеет низкую производительность при вызове несколько раз подряд, что, вероятно, является проблемой для вас.

По моему опыту getIntersection извлекает только один объект, который пересекает точку, и, кажется, возвращает только последний объект, добавленный на сцену, который пересекает точку! Я не уверен, как вы будете использовать это в своей ситуации.

Пользователь EliteOctagon написал собственную функцию обнаружения столкновений с лучшим успехом (и лучшей производительностью!): HTML5/kineticJS getIntersection function implementation Это может быть вашим лучшим выбором. Удачи!

О, и еще один небольшой наконечник на производительность: если вы пытаетесь выбрать формы, а не только «Прямоугольники», он будет работать лучше, если бы вы назвали все выбираемые формы того же имени, и использовать функцию .get() по имени а не только .get("Rect").

Например:

new Kinetic.Rect({ 
    name: "selectableShape" 
}); 

new Kinetic.Ellipse({ 
    name: "selectableShape" 
}); 

var selectableShapes = stage.get(".selectableShape"); 
+0

Спасибо за ответ. Я пришел к такому же выводу: 1. Текущая версия Kineticjs API не будет делать это очень хорошо, в будущих версиях могут появиться лучшие функции обнаружения столкновений. 2. Мне нужно придумать свой «алгоритм» Я решил рассчитать центр формы и проверить, находится ли он внутри областей выбора. Это будет сделано сейчас: http://jsfiddle.net/markusleth/FBjKY/ – user2553083

+0

Хотелось бы, чтобы я знал, как добавить линейные тормоза. Двойное пространство не работает ... – user2553083

Смежные вопросы