8

Je développe une application Mac OS X qui, dans le cadre de son interface utilisateur, affichera de nombreux éléments visuels dans sa vue principale qui peuvent être sélectionnés. Ces éléments peuvent être positionnés vraiment n'importe où dans la vue. L'interface utilisateur prendra en charge différentes manières de sélectionner les éléments: sélection rectangulaire du chapiteau, sélection elliptique du chapiteau et sélection du lasso «libre».Algorithme pour implémenter un outil de sélection au lasso?

J'ai déjà une sélection rectangulaire et elliptique. L'algorithme est assez simple. un élément est considéré comme 'sélectionné' si la zone de l'élément intersecte la zone du rectangle/ellipse.

La sélection au lasso fonctionnera comme dans les applications modernes de manipulation d'images comme Photoshop; l'utilisateur peut cliquer et faire glisser un chemin qui se fermera et les éléments contenus dans le chemin tracé seront sélectionnés.

Cet algorithme sera probablement beaucoup plus complexe que la sélection rectangulaire/elliptique, puisque la forme de la sélection n'est pas restreinte. Je me demande si quelqu'un a de l'expérience dans l'écriture de quelque chose comme ceci, ou si vous pouvez me diriger dans la bonne direction quant au type de techniques de programmation nécessaires, et quelle est la manière la plus efficace dont cet algorithme peut fonctionner.

Merci d'avance.

+0

Salut CJ, Si vous avez réussi à coder pour cette fonctionnalité, veuillez coller le lien pour l'exemple de code. Ce sera vraiment une aide complète pour moi aussi bien que pour les autres aussi. Cela nous sauvera beaucoup de temps. En attendant votre aide. – Gyanendra

Répondre

7

La seule façon dont je peux penser est de traiter le contour du lasso comme un polygone. Vous pouvez ensuite utiliser n'importe quelle norme point-inside-polygon test pour vérifier les éléments à sélectionner.

Vous devrez prendre une décision sur ce que vous devez faire lorsque le polygone se croise (par exemple, figure 8). Lors de la construction du polygone, pour éviter d'avoir trop de points, vous pouvez peut-être sauter des points trop proches du point précédent (peut-être 3 pixels environ, selon votre application).

+0

Merci, c'est exactement ce dont j'avais besoin. De la page Wikipedia, j'ai trouvé une ressource montrant l'exemple de code et les maths derrière le problème: http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html. Cet algorithme fonctionne assez bien pour moi, je peux même utiliser l'algorithme progressivement au fur et à mesure que l'utilisateur lasso sélectionne une région avec de très bonnes performances. Maintenant, j'écris une logique pour optimiser la fréquence à laquelle les points sont ajoutés au polygone; pas seulement basé sur la distance entre le dernier point, mais aussi en comparant les pentes/différence dans les angles des segments de ligne précédents. –

2

Vous cherchez un point dans un problème de polygone: http://en.wikipedia.org/wiki/Point_in_polygon Si vous pouvez garantir que le polygone est convexe (peu probable), l'algorithme devient plus simple.

+0

Les sélections au lasso ne sont généralement pas nécessairement des polygones - elles peuvent être n'importe quel chemin fermé. Dans Photoshop, par exemple, il y a l'outil Lasso et l'outil Lasso polygonal. –

+1

Un chemin fermé est un polygone, avec un grand nombre de points. Le sélecteur de Photoshop peut être optimisé plus facilement en raison du nombre fini d'objets dans le polygone et du fait qu'une unité de polygone = un objet. –

0

Pour l'outil lasso à main levée, vous pouvez prendre cette solution très simple: Enregistrer tous les points de la bordure de sélection dans un dictionnaire. Avec x comme clé et (y1, y2) comme valeur, où y1 <= y2. Puis bouclez sur tous les x' et voyez s'il y a une entrée dans le dict. Si oui, tous les points, où x' = x et y >= y1 and y <= y2, sont dans la sélection. Peut ne pas être la meilleure solution, mais cela devrait fonctionner.