8

Ich entwickle eine Mac OS X-Anwendung, die als Teil der Benutzeroberfläche viele visuelle Elemente in der Hauptansicht anzeigt, die ausgewählt werden können. Diese Elemente können wirklich überall in der Ansicht positioniert werden. Die Benutzeroberfläche unterstützt verschiedene Arten der Auswahl der Elemente: Auswahlrechtecke, elliptische Auswahlrahmen und "freie" Lassoauswahl.Algorithmus zur Implementierung eines Lasso-Auswahlwerkzeugs?

Ich habe bereits rechteckige und elliptische Auswahl Auswahl arbeiten. Der Algorithmus ist ziemlich einfach; Ein Element wird als "ausgewählt" betrachtet, wenn die Fläche des Elements die Fläche des Rechtecks ​​/ der Ellipse schneidet.

Die Lasso-Auswahl funktioniert genauso wie in modernen Bildbearbeitungsprogrammen wie Photoshop; Der Benutzer kann einen Pfad anklicken und ziehen, der sich selbst schließt, und die Elemente, die in dem gezeichneten Pfad enthalten sind, werden ausgewählt.

Dieser Algorithmus ist wahrscheinlich sehr viel komplexer als die rechteckige/elliptische Auswahl, da die Form der Auswahl nicht eingeschränkt ist. Ich frage mich, ob jemand Erfahrung darin hat, so etwas zu schreiben, oder ob Sie mir in die richtige Richtung weisen können, welche Art von Programmiertechniken notwendig sind und wie dieser Algorithmus am effizientesten funktioniert.

Vielen Dank im Voraus.

+0

Hallo CJ, Wenn Sie erfolgreich für diese Funktion Codierung getan haben dann bitte Link für den Beispielcode einfügen. Es wird mir wirklich helfen, aber auch für andere. Es wird viel Zeit sparen. Wir freuen uns auf Ihre Hilfe. – Gyanendra

Antwort

7

Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, den Lasso-Umriss als Polygon zu behandeln. Dann können Sie mit jedem Standard point-inside-polygon test prüfen, welche Elemente ausgewählt werden sollen.

Sie müssen eine Entscheidung treffen, was zu tun ist, wenn sich das Polygon selbst schneidet (z. B. Abbildung 8).

Wenn Sie das Polygon konstruieren, um zu vermeiden, dass es zu viele Punkte bekommt, können Sie möglicherweise Punkte überspringen, die zu nahe am vorherigen Punkt liegen (etwa 3 Pixel, abhängig von Ihrer Anwendung).

+0

Danke, das ist genau das, was ich brauchte. Von der Wikipedia-Seite habe ich eine Ressource gefunden, die Beispielcode und die Mathematik hinter dem Problem zeigt: http://www.ecse.rpi.edu/Homepage/wrf/Research/Short_Notes/pnpoly.html. Dieser Algorithmus funktioniert ziemlich gut für mich, ich kann den Algorithmus sogar progressiv verwenden, da das Benutzer-Lasso eine Region mit ziemlich guter Leistung auswählt. Jetzt schreibe ich eine Logik, um zu optimieren, wie oft Punkte zum Polygon hinzugefügt werden; nicht nur basierend auf der Entfernung zwischen dem letzten Punkt, sondern auch Vergleich der Neigungen/Winkelunterschiede der vorherigen Liniensegmente. –

2

Sie betrachten einen Punkt im Polygonproblem: http://en.wikipedia.org/wiki/Point_in_polygon Wenn Sie garantieren können, dass das Polygon konvex ist (nicht wahrscheinlich), wird der Algorithmus einfacher.

+0

Lasso-Auswahlen sind in der Regel nicht notwendigerweise Polygone - sie können beliebige geschlossene Pfade sein. In Photoshop gibt es beispielsweise das Lasso-Werkzeug und das Polygon-Lasso-Werkzeug. –

+1

Ein geschlossener Pfad ist ein Polygon mit einer großen Anzahl von Punkten. Der Photoshop-Selektor kann aufgrund der endlichen Anzahl von Objekten im Polygon und der Tatsache, dass eine Polygoneinheit = ein Objekt ist, einfacher optimiert werden. –

0

Für das Freihand-Lasso-Tool können Sie diese sehr einfache Lösung verwenden: Speichern Sie alle Punkte der Auswahlgrenze in einem Wörterbuch. Mit x als Schlüssel und (y1, y2) als Wert, wobei y1 <= y2. Dann schleifen Sie alle x' und sehen Sie, ob es einen Eintrag im Diktat gibt. Wenn ja, sind alle Punkte, wo x' = x und y >= y1 and y <= y2 sind, in der Auswahl.

Vielleicht nicht die beste Lösung, aber es sollte funktionieren.