Finden gemeinsamer Kanten: welche Datenstruktur ?

blablaman

Mitglied
Hallo,

ich habe hier eine Menge von zusammenhängenden Polygonen, wobei jedes Polygon aus einer Menge von Punkten besteht. Ich bin dabei, eine Klasse z uschreiben, die gemeinsame Kanten findet.

Ich habe mir Folgendes überlegt:
//Algorithmus
//1. beliebiges Startpolygon aus einer Startliste(ArrayList) von Polygonen auswählen, dessen Punkte in eine Liste(LinkedHashSet) einlesen
//2. Schnitt mit der Punktemenge des nächsten Polygons aus der Startlist bilden; falls nicht, das nächste Polygon aus der Startlist in einer zweiten Liste(unhandledPolygons) abspeichern
//3. Schnittemenge als PolygonPair(PolygonId, Point[]) abspeichern
//4. Differenzmengen vereinigen zu einem Polygonzug / einer Menge(LinkedHashSet), der dann den Umriss darstellt
//5. Diese Menge erneut als Startpolygon wählen und wieder bei 1. anfangen
//Wiederholung bis alle Polygone(Bsp.: List unhandledPolygon ist
//leer) betrachtet wurden

Ich möchte gern wissen, wie man das mit dem Abspeichern der Polygonen, die nicht benachbart sind mit dem aktuellen Polygon, am besten lösen kann.

Über Tipps würde ich mich freuen.


Grüße


blablaman
 

function

Bekanntes Mitglied
Wenn ich, das richtig verstanden habe sind in der Startliste doch alle Polygone gespeichert oder? Sagen wir mal du nimmst das 1. Polygon als Startpolygon und vergleichst es direkt mit dem Zweitem
-> Sie sind "benachbarte" Polygone zusammenfügen an Stelle 1 speichern, 2. Polygon aus der Liste löschen
-> Sie sind nicht "benachbart", erstes Polygon mit dem 3. vergleichen ggf. zusammenfügen und 3. löschen.
So sind alle Polygone vorhanden und beim zusammensetzen wird die Liste um 1 verringert.

Allerdings sehe ich evtl ein paar Probleme:
1. Sind wirklich alle Polygone der Liste zusammenhängend, also kann man aus allen Polygonen am Ende wirklich 1 "großes" Polygon bilden.
2. Was ist wenn 2 Polygone zwar zusammenhängen allerdings nicht über eine ganze Kantenlänge? Dann hänge sie zwar zusammen, aber können nicht durch einfaches entfernen einer Kante zusammengefügt werden...
 

blablaman

Mitglied
Hallo,

vielen Dank für deine Antwort.
Ich habe für die Liste LinkedList, die eigentlich die Operationen addFirst, removeFirst bereitstellt.
Ich kann die Methoden nicht aufrufen bzw, die sind nicht sichtbar. Ich benutzer Eclipse 3.5.1 und als JDK Compliance 1.4. Vllt kannst du mir da weiterhelfen.

Grüße


blablaman
 

blablaman

Mitglied
Hat sich erledigt.

Nun habe ich eine Endlosschleife im Code und blicke gerade nicht durch.

Java:
while( polygonsList.size() != 1 ){			
			//nächstes Polygon aus Liste holen
			nextPolygon = (Polygon) polygonsList.pop();
			
			//Punkt des Polygon herauslesen und abspeichern
			nextPolygonPoints = new LinkedHashSet( Arrays.asList( nextPolygon.getVertices() ) );
			
			//Schnittmenge mit Startpolygon bilden
			if( startPoints.retainAll(nextPolygonPoints) ){
				//Startpolygon und das als Nächstes zu betrachtenes Polygon sind benachbart
				intersectionPoints = startPoints;
				System.out.println("insectionPoints array length: " + intersectionPoints.size());
				//gemeinsame Kante als PolygonPair-Objekt speichern
				//TODO: PolygonId ???
				Point[] points = (Point[]) intersectionPoints.toArray( new Point[ intersectionPoints.size() ] );
				System.out.println("points array length: " + points.length);
				polyPair = 
					new PolygonPair( "id", 
									(Point[]) intersectionPoints.toArray( new Point[ intersectionPoints.size() ] ) );
				polyPairs.add(polyPair);
				
				//Startpolygon wieder neu definieren aus Vereinigung 
				//der Differenzmengen
				// A = {startPoints} / {currentPolygonPoints} 
				// B = {currentPolygonPoints} / {startPoints}  
				// A union B
				perimeterPoints.removeAll(nextPolygonPoints);
				nextPolygonPoints.removeAll(help);
				perimeterPoints.addAll(nextPolygonPoints);
				startPoints = perimeterPoints;
				
				points = (Point[]) perimeterPoints.toArray( new Point[ perimeterPoints.size() ] );
				Polygon newStartPolygon = new Polygon(points);
				polygonsList.addFirst(newStartPolygon);
			}else{
				System.out.println("insectionPoints array length: " + startPoints.size());
				//Startpolygon und das als Nächstes zu betrachtenes Polygon 
				//sind nicht benachbart: zu betrachtendes Polygon in einer Liste speichern
				polygonsList.addLast(nextPolygon);
			}			
			
		}
 

Schumi

Bekanntes Mitglied
Also was mir beim kurzen Übschauen nur auffällt, Du popst einmal etwas runter und sowohl im if als auch im else setzt Du wieder was in die Liste, dabei kann die doch nicht kleiner werden?
 

Landei

Top Contributor
Ich hab nicht genau drübergeguckt, aber meistens läuft es bei solchen Endlosschleifen darauf hinaus, sich ein "HattenWirSchon"-Set anzulegen, wo alle abgehakten Kanten oder was auch immer reingepackt und beim nächsten mal entsprechend ignoriert werden.
 

blablaman

Mitglied
Erstmal danke für die Tipps. Ich habe nun keine Endlosschleife mehr.
Aber meine Schleife funktioniert trotzdem noch nicht richtig.
Und zwar habe ich eine Liste mit Polygonen, die ein zusammenhängendes Gebiet bilden.

Ich nehme das erste als Startpolygon, und nehme mir das zweite in der Liste und gucke ob sie benachbart sind, wenn nicht muss ich zum dritten, wenn nicht wieder zum vierten usw. Das Problem ist, wie komme ich dann wieder zurück zum zweiten und zum dritten Polygon, wenn ich das nächste benachbarte Polygon erst an Stelle n finde. Weil es kann ja sein, dass das n-te Polygon benachbart ist mit dem zweiten und dem dritten. Über Tipps würde ich mich freuen.

Grüße


blablaman
 

blablaman

Mitglied
Hallo,

ich würde gern fragen, ob ihr ein Paar Links oder Literaturhinweise für mich zum Thema "gemeinsame Kanten finden" hat.
Google habe ich auch schon besucht, vllt habt ihr ja ein Paar Links, die ich noch nciht kenne.

Grüße


blablaman
 

newnoise

Mitglied
Hallo,

das Thema ist zwar schon älter, aber sitze quasi vor dem gleichen Problem. Hast Du mittlerweile eine Lösung gefunden? Falls ja, magst Du mir mal deine Klasse zeigen?
Das wäre super!

Danke
noise
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
B Alle Zahlen finden, die 3 bestimmte Ziffern enthalten? Java Basics - Anfänger-Themen 9
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
J for Schleife kleinste Zufallszahl finden Java Basics - Anfänger-Themen 25
Substring in einem String finden Java Basics - Anfänger-Themen 13
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
districon Java Nachhilfe - wo finden? Java Basics - Anfänger-Themen 9
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
M Datums-Palindrome finden Java Basics - Anfänger-Themen 9
H Primzahlen finden - Zeit optimieren Java Basics - Anfänger-Themen 34
B in einem Array den nächstgelegenen Wert zu einem eingabewert finden Java Basics - Anfänger-Themen 8
B String - Wörter finden, welches Punkt und entsprechender Pre / Suffix hat? Java Basics - Anfänger-Themen 30
S Schwachstelle finden Java Basics - Anfänger-Themen 11
D kleinste Wurzel finden Java Basics - Anfänger-Themen 9
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
Devin Wo kann man einen Java Lehrplan finden? Java Basics - Anfänger-Themen 5
Y Wie kann ich ein Element in einer toString finden. Java Basics - Anfänger-Themen 2
V Beliebige Dreistellige Zahl Teiler finden Java Basics - Anfänger-Themen 4
J Lösungen zu einem Lückentext finden Java Basics - Anfänger-Themen 0
S Input/Output Reader/Writer finden file nicht Java Basics - Anfänger-Themen 3
S Streams - kleinstes Element finden Java Basics - Anfänger-Themen 4
L Koordinate mit meisten Überlappungen in 3D-Raum finden Java Basics - Anfänger-Themen 9
KogoroMori21 Größten gemeinsamen Teiler finden Java Basics - Anfänger-Themen 7
F Methoden Bitte Helft mir meinen Fehler zu finden. Möchte in diesem Bankenprogramm durch die Konsoleneingabe auswählen welches Konto reduziert und welches erhö Java Basics - Anfänger-Themen 17
Kirby.exe Fehlende Int Werte aus Array mit streams finden Java Basics - Anfänger-Themen 19
I Preis finden für ein Uber-App(?) Java Basics - Anfänger-Themen 3
D Binärbaum Blätter finden und Ausgeben Java Basics - Anfänger-Themen 22
L Classpath Alle Dateien im Classpath finden Java Basics - Anfänger-Themen 4
O Suchbaum Elternknoten finden Level eines Knoten bestimmen Java Basics - Anfänger-Themen 24
H pfad finden Java Basics - Anfänger-Themen 12
G Excle datei aus resources folder finden und lesen Java Basics - Anfänger-Themen 5
M Duplikate in Array finden... Java Basics - Anfänger-Themen 9
A Mit Rekursion Zufallszahlen erstellen und größte finden Java Basics - Anfänger-Themen 5
S Maxium aus einer File finden Java Basics - Anfänger-Themen 12
R HTTP-Links in Java Class finden Java Basics - Anfänger-Themen 3
S Substrings finden Java Basics - Anfänger-Themen 5
C Finden mehrerer Lösungen Java Basics - Anfänger-Themen 0
L Backupdateien finden Java Basics - Anfänger-Themen 8
D doc.seect jsouo bestimmtes class element finden Java Basics - Anfänger-Themen 1
N Anfang eine Array Schleife finden Java Basics - Anfänger-Themen 18
D Erste Schritte Aktivsten Zweistündigen Abschnitt finden Java Basics - Anfänger-Themen 35
I Richtige Java-Version finden? Java Basics - Anfänger-Themen 17
DaCrazyJavaExpert Alle Zahlenkombinationen aus 9 zahlen finden Java Basics - Anfänger-Themen 17
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
M Denn dichtesten Wert finden Java Basics - Anfänger-Themen 3
N Objekte in ArrayList finden Java Basics - Anfänger-Themen 10
D Die Zahl in der Mitte finden Java Basics - Anfänger-Themen 20
kilopack15 Größte zahl eines Arrays finden Java Basics - Anfänger-Themen 1
H Fehler finden Java Basics - Anfänger-Themen 5
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
M Kleinsten Index in Array finden Java Basics - Anfänger-Themen 6
S Objekt finden und benutzen Java Basics - Anfänger-Themen 3
C Lottospiel kann Fehler nicht finden Java Java Basics - Anfänger-Themen 6
F System kann die Datei nicht finden Java Basics - Anfänger-Themen 7
D Werte in eckige Klammern finden Java Basics - Anfänger-Themen 3
S Input/Output Buchstaben in Eingabe finden und ausgeben Java Basics - Anfänger-Themen 5
A regulären Ausdruck mit Hilfe der Klasse Scanner in einem String finden Java Basics - Anfänger-Themen 2
N Objekt in einer Liste finden? Java Basics - Anfänger-Themen 3
C Finden und verändern Java Basics - Anfänger-Themen 1
T Erste Schritte Elemente finden, deren Name erst "zusammengesetzt" wird Java Basics - Anfänger-Themen 8
A Max finden und umtauschen Java Basics - Anfänger-Themen 2
K String in String-Array finden Java Basics - Anfänger-Themen 7
S Baumstruktur: tiefsten Knoten finden Java Basics - Anfänger-Themen 3
D Ein Objekt in einem Baum finden und ausgeben. Java Basics - Anfänger-Themen 4
F Erste Schritte Hilfe beim Algorithmus finden Java Basics - Anfänger-Themen 8
D Zahl in einem String finden Java Basics - Anfänger-Themen 4
C Methoden Diagonalen am best. Punkt im zweidimensionales array finden Java Basics - Anfänger-Themen 3
A Compiler-Fehler Kann Fehler nicht finden Java Basics - Anfänger-Themen 2
R Fehler finden die 2. Java Basics - Anfänger-Themen 7
N Bug finden im Programm Java Basics - Anfänger-Themen 13
P letzte Datei finden Java Basics - Anfänger-Themen 18
M Zwei gleiche Eintraege in ArrayList finden Java Basics - Anfänger-Themen 15
J Inhalt in einem Text-File finden und in ein Array schreiben Java Basics - Anfänger-Themen 5
I String in .txt finden Java Basics - Anfänger-Themen 9
T Wörter mit @ als Zeichen finden Java Basics - Anfänger-Themen 13
J Methoden Kann Fehler nicht finden Java Basics - Anfänger-Themen 6
M Letztes Element im Array finden Java Basics - Anfänger-Themen 3
R Erste Schritte Minimum und Maximum in Array finden Java Basics - Anfänger-Themen 29
H Schnell HTML-Tags finden Java Basics - Anfänger-Themen 5
Kenan89 Wo sind die Java Standard Library Source Codes zu finden? Java Basics - Anfänger-Themen 5
R Rekursive Methode, Files finden Java Basics - Anfänger-Themen 2
S brauche hilfe beim fehler finden Java Basics - Anfänger-Themen 2
B Dokumentation in der jre-Library finden Java Basics - Anfänger-Themen 9
T Datentypen Knoten Großvater finden? Java Basics - Anfänger-Themen 12
A Fehler finden und Ausgabe Java Basics - Anfänger-Themen 14
P Key anhand von Value finden (Hashtable) Java Basics - Anfänger-Themen 3
Q ProcessBuilder kann datei nicht finden Java Basics - Anfänger-Themen 2
K taschenrechner - Fehler beim Kürzen eines Bruches finden Java Basics - Anfänger-Themen 20
S Richtige String-Variable finden Java Basics - Anfänger-Themen 3
C Fehler in Java-Code finden Java Basics - Anfänger-Themen 17
D Geeigneten Speicherort finden ? Java Basics - Anfänger-Themen 11
K Groessere Zahl finden und berechnen?? Java Basics - Anfänger-Themen 6
H Methoden Schachbrettmuster finden Java Basics - Anfänger-Themen 11
brunothg Gameserver finden Java Basics - Anfänger-Themen 7
X im Verzeichnissbaum recursiv nur bestimmte Dateien finden Java Basics - Anfänger-Themen 7
F Methoden Fehler finden in Funktion Java Basics - Anfänger-Themen 3
A Prüfen ob Datei geöffnet ist bzw Stream finden Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben