ковыряние в java 2d

Я использую java2d для рисования простого графика в тот момент, когда я реализовал сбор, вызвав contains(MousePoint) для каждого объекта/формы, это работает, но масштабируется линейно.

Есть ли более эффективный метод выбора в java2d?


person stimpie    schedule 08.12.2009    source источник


Ответы (2)


Да, хотя полный ответ был бы слишком длинным для этого места.

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

Во-вторых, в общем случае вам нужно применить некоторую иерархическую декомпозицию, такую ​​как quadtree. Это способ использовать больше памяти (и больше времени, амортизируемого во время поиска), чтобы исключить элементы из рассмотрения на так называемой «широкой фазе». Некоторое усердие в Интернете поможет, как и книга «Обнаружение столкновений в реальном времени" Кристера Эриксона.

person Jonathan Feinberg    schedule 08.12.2009
comment
Это то направление, о котором я думал, но это требует, чтобы я реализовал его сам. Может быть, лучше использовать java3d и использовать уже реализованные сцены и выборки. - person stimpie; 08.12.2009

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

Метод contains() не будет работать, если вы хотите выбрать фигуры типа Line2D. У них нет области, поэтому метод contains() всегда возвращает false. Но уже есть решение на SO для этой проблемы.

person Andreas Dolk    schedule 08.12.2009