Punkte in einem Pfad in Android finden

7

Gibt es einen Grund, warum sie beschlossen haben, die Methode contains (für Path) in Android nicht hinzuzufügen?

Ich möchte wissen, welche Punkte ich in einem Pfad habe und hoffe, dass es einfacher ist als hier zu sehen:

Wie kann ich feststellen, ob? Ein geschlossener Pfad enthält einen bestimmten Punkt?

Wäre es für mich besser, eine ArrayList zu erstellen und die Ganzzahlen in das Array einzufügen? (Ich überprüfe die Punkte nur einmal in einer Kontrollaussage.) Dh. if(myPath.contains(x,y)

Bisher sind meine Optionen:

  • Verwenden einer Region
  • Verwenden einer ArrayList
  • Erweitern der Klasse
  • Ihr Vorschlag

Ich bin nur auf der Suche nach dem effizientesten Weg, den ich hier machen sollte

    
StartingGroovy 12.08.2011, 18:43
quelle

4 Antworten

14

Ich bin vor einiger Zeit auf dasselbe Problem gestoßen und nach einigem Suchen fand ich, dass dies die beste Lösung ist.

Java hat eine Klasse Polygon mit einer contains() -Methode, die die Dinge wirklich einfach macht. Leider wird die java.awt.Polygon -Klasse in Android nicht unterstützt. Ich konnte jedoch jemanden finden, der ein äquivalente Klasse .

Ich glaube nicht, dass Sie die einzelnen Punkte, die den Pfad ausmachen, von der Klasse Android Path erhalten, also müssen Sie die Daten auf andere Weise speichern.

Die Klasse verwendet einen Crossing Number-Algorithmus, um zu bestimmen, ob sich der Punkt innerhalb der gegebenen Punktliste befindet oder nicht.

%Vor%     
theisenp 12.08.2011, 18:56
quelle
7

Ich möchte nur @theisenp antwort kommentieren: Der Code hat Integer-Arrays und wenn Sie auf der Webseite der Algorithmusbeschreibung schauen, warnt es davor, Ganzzahlen anstelle von Gleitkommazahlen zu verwenden.

Ich habe Ihren Code oben kopiert und er schien gut zu funktionieren, außer in einigen Fällen, in denen ich Linien gemacht habe, die sich nicht sehr gut mit sich selbst verbinden.

Indem ich alles auf Gleitkomma ändere, habe ich diesen Fehler beseitigt.

    
Sebastian 29.04.2012 19:19
quelle
6

Versuchte die andere Antwort, aber es ergab ein falsches Ergebnis für meinen Fall. Ich habe nicht die genaue Ursache gesucht, sondern meine eigene direkte Übersetzung aus dem Algorithmus gemacht auf: Ссылка

Jetzt lautet der Code:

%Vor%     
Hans 20.12.2011 09:34
quelle
0

Der Vollständigkeit halber möchte ich hier ein paar Anmerkungen machen:

Ab API 19 gibt es ein Schnittpunktoperation für Pfade. Sie könnten einen sehr kleinen quadratischen Pfad um Ihren Testpunkt herum erstellen, ihn mit dem Pfad schneiden und sehen, ob das Ergebnis leer ist oder nicht.

Sie können Pfade in Regionen konvertieren und ein contains () Operation. Regionen arbeiten jedoch in ganzzahligen Koordinaten, und ich denke, dass sie transformierte (Pixel-) Koordinaten verwenden, also müssen Sie damit arbeiten. Ich vermute auch, dass der Umwandlungsprozess rechenintensiv ist.

Der Kantenübergangsalgorithmus, den Hans gepostet hat, ist gut und schnell, aber Sie müssen bei bestimmten Eckenfällen sehr vorsichtig sein, beispielsweise wenn der Strahl direkt durch einen Eckpunkt verläuft oder eine horizontale Kante schneidet oder wenn ein Rundungsfehler vorliegt ist ein Problem, das ist es immer.

Die Windungsnummer Methode ist ziemlich narrensicher, beinhaltet aber eine Menge trig und ist rechenintensiv.

Dieser Artikel von Dan Sunday gibt einen hybriden Algorithmus, der so genau ist wie die Windungszahl, aber so einfach wie der Strahl ist -Casting-Algorithmus. Es hat mich umgehauen, wie elegant es war.

Mein Code

Dies ist ein Code, den ich kürzlich in Java geschrieben habe und der einen Pfad behandelt, der aus den beiden Liniensegmenten und besteht. (Auch Kreise, aber das sind vollständige Pfade für sich allein, also ist es ein degenerierter Fall.)

%Vor%

Bearbeiten: Auf Wunsch fügen Sie einen Beispielcode hinzu, der dies verwendet.

%Vor%     
Edward Falk 28.11.2015 17:29
quelle

Tags und Links