2009-12-08 8 views
3

J'utilise java2d pour dessiner un graphe simple au moment où j'ai implémenté picking en appelant contient (MousePoint) pour chaque objet/forme, cela fonctionne mais échelles linéairement.Picking in java 2d

Existe-t-il une méthode plus efficace pour choisir dans java2d?

Répondre

4

Oui, bien que la réponse complète soit trop longue pour cet espace.

Tout d'abord, à moins que vous avez beaucoup de nœuds, alors linéaire sera très probablement bien, et vous ne devriez pas changer quoi que ce soit à moins la performance est déjà vu souffrir. Deuxièmement, vous voulez généralement appliquer une sorte de décomposition hiérarchique, par exemple quadtree. C'est une façon d'utiliser plus de mémoire (et plus de temps à l'avance, amorti pendant les recherches) pour éliminer les éléments à considérer dans une «phase large». Une certaine diligence sur le web aidera, tout comme le livre "Real-Time Collision Detection", de Christer Ericson.

+0

C'est la direction que je pensais mais qui m'oblige à l'implémenter moi-même. Peut-être est-il préférable d'utiliser java3d et d'utiliser le SceneGraph et le picking déjà implémentés. – stimpie

+0

+1 pour "optimiser quand vous en avez besoin". –

1

Tant que vous ne sélectionnez que des formes aréales (rectangles, cercles), cela devrait fonctionner avec la méthode contains(). Il y a juste un piège juste au cas où vous avez des formes qui se chevauchent et vous pointez vers un endroit où les formes se chevauchent réellement. Mais c'est une question d'exigence si vous voulez sélectionner toutes les formes, celle en haut ou la première forme que vous trouvez dans votre collection.

La méthode contains() ne fonctionnera pas si vous souhaitez sélectionner des formes de type Line2D. Ils n'ont pas de zone donc la méthode contains() renvoie toujours false. Mais il y a déjà un solution on SO for this problem.