OOP Mustererkennungs Aufgabe

dutchman79

Mitglied
Ich fange gerade an ein Art Mustererkennungsproblem in Java umzusetzen.

Auf einem regelmässigen Gitter ( horz. und vert. gleicher Abstand) gibt es ausgezeichnete Punkte, die mit einem "x" markiert sind.
Wie viele Rechtecke kann man bilden, indem man jeweils vier der x-Punkte als Eckpunkte nimmt und diese durch gerade Strecken verbindet ?
Die Rechtecke dürfen auch "schräg" liegen.
Zusätzlich soll ich ermitteln wieviele der Rechtecke Quadrate sind und eine Flächenstatistik erstellen.

Ein Beispiel der Daten die ich einlese:

Java:
*Dies ist ein 4x5 Beispiel mit 2 Rechtecken, davon 2 Quadrate
*1. Zeile: Dimensionen, danach Gitter zeilenweise
*/
4 5
0x0x0
0x000
0x0xx
00x00

Als Ausgabe möchte ich so etwas produzieren wie:

1.Rechteck: (1,2) (1,4) (3,4) (3,2)
2.Rechteck: (1,4) (3,5) (4,3) (2,2)
Insgesamt: 2 Rechtecke davon 2 Quadrate
Anzahl mit Flaeche   4:   1
Anzahl mit Flaeche   5:   1


Ich suche gerade einen möglichst effizienten Algorithmus und habe irgendwie noch keine Ahnung.
Hat jemand eine gute Idee ?
 
J

JohannisderKaeufer

Gast
Reicht ein einfacher Algorithmus nicht aus?

Ich würde behaupten das die Daten in Form von
(1,2)
(1,4)
...
(4,3)

besser aufgehoben sind.
 

dutchman79

Mitglied
Okay,

Mit dem Algorithmus habe ich gerade meine Schwierigkeiten.

Ich sehe ein dass wenn ich das Feld auslesen und zB in der der selben Zeile in der 2. und 3 .Spalte ein Eckpunkt habe, ich dann nur noch suchen muss in genau diesen Spalten, weil nur dort dann noch ein Rechteck oder Quadrat geformt werden könnte.

Nur um dann irgendwie richtung allgemeiner Fall statt diesen Spezialfällen zu kommen bereitet mir Schwierigkeiten.
 

MrWhite

Bekanntes Mitglied
Hmm, ich würde das mit einer Art Scanning Algorithmus machen. Ist nicht ganz naiv, sollte auch ein besseres Laufzeitverhalten als Bruteforce haben.

Nimm einen beliebigen Punkt mit X.
Jetzt lege für jeden Winkel (1°..360° oder wenn schief bedeutet, dass es nur 90° und 45° sein können, dann 45°) eine Gerade durch diesen Punkt, merke dir alle Punkte, die du für einen Winkel triffst. Für diese Punkte musst du jetzt im Prinzip immer nur Lote (als Halbgeraden, potentiell in beide Richtungen) erstellen und dir wiederum merken, welche Punkte die treffen. Wenn du dann vom dritten (Schnitt-)Punkt aus mit einem Lot wieder durch den Ursprungspunkt kommst, hast du ein Rechteck. Counter erhöhen... Jetzt kannst du für das gefunde Rechteck noch die Streckenlängen prüfen und feststellen, ob es ein Quadrat ist.

Bruteforce ist natürlich eazy peazy. Da würde ich dann auch keine Optimierungen mehr durchführen.

Hmm, hab nochmal ein bissal gestöbert: Für Bildverarbeitung (und im Prinzip hast du ein binäres Bild), kannst du so etwas mit der Hough-Transformation lösen.

Hough transform - Wikipedia, the free encyclopedia
Intro
 
Zuletzt bearbeitet:
J

JohannisderKaeufer

Gast
In deinem Beispiel hast du

7 Punkte

Nimm den ersten Punkt (Root) und entferne ihn aus der Liste (Rest)

Nun bildest du Vektoren zu allen Punkten i...n in Rest die ihren Ursprunkg in root haben
vx = rest.x - root.x
vy = rest.y - root.y

Nun berechnest du für alle diese Vektoren ob sie paarweise Orthogonal, (Rechtwinklig zueinander stehen).

Für die verktoren j und k kann das so aussehen.
v[j].x * v[k].x + v[j].y * v[k].y == 0
Beim Skalarprodukt von zwei Vektoren muß 0 herauskommen ansonsten nicht Rechtwinklig.


Hast du einen oder mehrere Treffer z.B Vektor 2 und 3
Dann schaue ob in rest ein Punkt der folgende Kriterien erfüllt existiert, das wäre dann der fehlende Eckpunkt.

x = root.x + v[2].x + v[3].x
und
y = root.y + v[2].y + v[3].y

Wenn ja, Dann hast du ein Rechteck gefunden, wenn nein, Pech gehabt.

Nun hast du erstmal alle Rechtecke gefunden, die root als einen Eckpunkt haben. Gratulation.

Nun entferne root aus deinem Gedächtnis nimm Rest such dir daraus einen neuen Punkt heraus und wiederhole den gesamten Algorithmus, bis in Rest weniger als 3 Elemente vorhanden sind.

Mit den oben berechneten Vektoren, ist es auch ein Kinderspiel herauszubekommen ob es sich um ein Quadrat handelt und wie groß der Flächeninhalt ist.

Also nix Spalten schauen oder Gradzahlen durchgehen, es gibt auch grade zwischen 0 und 1. 0,5 zum Beispiel.

Etwas Algebra und fertig ist die Luzi.

Skalarprodukt ? Wikipedia

Orthogonalität ? Wikipedia
 
Zuletzt bearbeitet von einem Moderator:

Kaniee

Mitglied
Hmm...also ich würde die Eckpunkte nehmen und durchgehen. Dabei bei jedem noch die Folgenden durchzählen. Somit hast du jeden Punkt mal mit jedem verbunden. Dann die Steigung zwischen den beiden ausrechnen und sie um 90 Grad drehen. Dann nachschauen ob auf der Steigung in Punkt liegt und abschliesend berrechnen wo der letzte Punkt liegt. Natürlich muss man noch prüfen ob an dem berechneten Punkt wirklich ein Eckpunkt liegt.
Es ist nicht wirklich effizient aber es müsste funktionieren und alles Möglichkeiten abdecken.

Kaniee

Edit: hatte das von JohannisderKaeufer nicht gesehen als ich das geschrieben hab...sieht ähnlich aus
 
T

Threadpool@

Gast
Da mir die Aufgabe bekannt vorkam, such mal nach "Finding squares and rectangles in set of points", da müsste es ein gleichnamiges Paper geben das genau diese Thematik mit relativ effizienten Algorithmen aufgreift.
 

dutchman79

Mitglied
So, bin jetzt bei der Implementierung.

Habe das Projekt schon Mal aufgeteilt in 3 packages.
Eins zur Eingabe, eins zur Verarbeitung und eins zur Ausgabe.

Wenn ich es richtig verstanden habe, brauche ich beim Einlesen nur die Dimensionen und die Markierte Punkte zu merken ? Die Letzteren würde ich dann zB in eine ArrayList stecken ?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Objekt Array Aufgabe mit Busdatenbank Allgemeine Java-Themen 2
O Test schreiben mit Äquivalenzklassen (Aufgabe Prüfung) Allgemeine Java-Themen 9
OnDemand Erstellen von Quartz Jobs pro Aufgabe oder zusammenfassen Allgemeine Java-Themen 7
M Bräuchte Hilfe bei der Aufgabe Allgemeine Java-Themen 1
parrot Array Aufgabe Allgemeine Java-Themen 3
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
S Aufgabe erwünscht Allgemeine Java-Themen 7
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
M Polymorphie Aufgabe Allgemeine Java-Themen 15
H Stack mit bestimmter Aufgabe Allgemeine Java-Themen 62
E Java Aufgabe WaWi01 Allgemeine Java-Themen 7
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
R Java-Code für folgene Aufgabe? Allgemeine Java-Themen 8
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
G Erste Schritte Aufgabe - Geht das auch schneller ? Allgemeine Java-Themen 7
R Was los mit dieser Aufgabe? Arrays mit Schachbrettmustern? Allgemeine Java-Themen 10
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
D Aufgabe: Schnittstelle und Proxy implementieren Allgemeine Java-Themen 2
D BlueJ - Aufgabe 12 namens Traktor Allgemeine Java-Themen 7
pg1337 Firmen-aufgabe Allgemeine Java-Themen 10
B Konkrete Aufgabe Allgemeine Java-Themen 9
S Textverständnis einer Aufgabe Allgemeine Java-Themen 2
F Frage zu Aufgabe Allgemeine Java-Themen 5
P Java-Security-Aufgabe gesucht Allgemeine Java-Themen 2
M Brauche einen Tipp, bei einer Aufgabe ! Allgemeine Java-Themen 3
I Aufgabe: Aufwandsabschätzung Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben