Ich entwickle eine Mac OS X-Anwendung, die als Teil ihrer Benutzeroberfläche viele visuelle Elemente in ihrer 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, Ellipsenauswahl und "freie" Lassoauswahl.
Ich habe bereits eine rechteckige und elliptische Auswahl. Der Algorithmus ist ziemlich einfach; Ein Element wird als 'ausgewählt' angesehen, wenn der Bereich des Elements den Bereich 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 in dem gezeichneten Pfad werden ausgewählt.
Dieser Algorithmus wird wahrscheinlich sehr viel komplexer sein 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 mich in die richtige Richtung weisen können, welche Art von Programmiertechniken notwendig sind und wie der Algorithmus am effizientesten funktioniert.
Vielen Dank im Voraus.
Ich kann nur daran denken, den Lasso-Umriss als Polygon zu behandeln. Dann können Sie jeden standardmäßigen Punkt-Innen-Polygon-Test verwenden, um zu 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 (je nach Anwendung etwa 3 Pixel).
Sie betrachten einen Punkt im Polygonproblem: Ссылка Wenn Sie garantieren können, dass das Polygon konvex ist (nicht wahrscheinlich), wird der Algorithmus einfacher.
Für das Freihand-Lasso-Werkzeug können Sie diese sehr einfache Lösung wählen: Speichern Sie alle Punkte des Auswahlrahmens in einem Wörterbuch. Mit x
als Schlüssel und ( y1
, y2
) als Wert, wobei y1 <= y2
. Schleife dann alle x'
und überprüfe, ob ein Eintrag im Dict vorhanden ist. Wenn ja, sind alle Punkte mit x' = x
und y >= y1 and y <= y2
in der Auswahl.
Vielleicht nicht die beste Lösung, aber es sollte funktionieren.
Tags und Links algorithm cocoa selection image-manipulation edge-detection