Autor |
Beitrag |
Geri
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Mo 30.06.08 12:49
Hallo
Ich habe eine Vektorgrafik, bestehend aus Geraden und Kreisbögen. Teilweise sind diese Objekte miteineander an den Endpunkten verbunden und bilden so einen Linienzug (z.B. ein Rechteck, ein Polygon, teilweise auch komplexe Polygone).
Nun möchte ich die zusammenhängenden Objekte erkennen.
Ich kann mir vorstellen, dieses Problem tritt oft auf und wurde bereits ausreichend in einen effizienten Algorithmus umgesetzt. Bei meinen Recherchen bin ich allerdings noch nicht fündig geworden. Vielleicht auch deshalb, weil mir der richtige Suchbegriff fehlte:)
Habe ihr hier vielleicht eine Idee?
Beste Grüsse und vielen Dank
Geri
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 30.06.08 13:12
In welcher Form sind deine Eingabe-Daten gegeben?
Müssen spezielle Konstellationen oder allgemein vorhandene (zusammenhängende) Objekte erkannt werden?
Liegt die Eingabe aus der Vektor-Grafik rasterisiert vor, oder liegen die vorhandenen Linienzüge und Bögen als Beschreibungen einzeln vor?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Mo 30.06.08 13:29
Hallo
Die Daten liegen im Vektorformat vor. Z.B. Linien und Kreisbögen vor, von allen Objekten hat man die Start und Endpunkte sowie die bei Kreisbögen den Mittelpunkt. Anbei ein Beispiel.
Die Objekte sind in einer TListe unsortiert.
Ziel ist es nun, die zusammenhängenden Objekte zu erkennen. Im gezeigten Beispiel wäre das Ergebnis drei Linienzüge.
Beste Grüsse
Geri
Moderiert von Narses: Überzähligen Dateianhang gelöscht
Einloggen, um Attachments anzusehen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 30.06.08 14:21
Für dich könnte das Thema Pathfinding in ungerichteten Graphen interessant sein (Breitensuche).
Dazu speicherst Du Anfang und Endpunkt jedes Objektes in eine Liste, sortierst diese Liste nach den Koordinaten (nicht notwendig, aber hilft u.U. beim Verbessern der Performance) und entfernst aus dieser Liste jegliche Objekte (und merkt sich diese gesondert), die an diesem Punkt anliegen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Geri 
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Mo 30.06.08 16:37
Hallo
Ich glaube auch, dass eine theoretische Basis in der Graphentheorie gefunden werden kann. Die Pathfinding-Algorithmen gehen für mich aber eher in die Richtung Optimierung (z.B. shortest path), wenn man man mal z.B. von der Breitensuch absieht.
Prinzipiell kann ich mir aktuell folgendes Vorgehen vorstellen:
1.) Aufbau des Graphen
2.) Analyse des Graphen (Bestimmung der Komplexität)
3.) Verketten der Kanten zu Linienzügen
Wie man das aber effizient macht, das würde mich mal interessieren...
Beste Grüsse
Geri
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 30.06.08 20:09
Ich würde das so lösen:
1. Schnapp Dir ein Objekt (X) mit den Endpunkten Px0 und Px1.
2. Finde ein Objekt Y mit Endpunkten Py0 und Py1, das X an Px0 oder Px1 berührt.
2.1 Gibt es ein solches Objekt, verbinde es mit X und ersetze Px0 bzw. Px1 durch den freien Endpunkt von Y. Das neue Objekt sei 'X'.
2.2 Entferne Y aus der Liste der Objekte (damit man es nicht nochmal findet) und Goto 2
3. Das Objekt X ist geschlossen gdw, Px0=Px1
4. Goto 1
Das funktioniert in O(N), wenn man die Objekte vorher geeignet in eine Hashmap packt. sodaß man schnell nach passenden Objekten (mit Berührungspunkten) suchen kann.
_________________ Na denn, dann. Bis dann, denn.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 30.06.08 20:16
Man nehme einen Knoten. Dieser ist in Objekt X, nun suche man über Breitensuche alle Knoten, die man von diesem Knoten aus erreichen kann und entferne sie.
Man wiederhole diesen Schritt solange, bis keine Knoten mehr da sind
Was ist daran so schwer?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 30.06.08 20:25
BenBE hat folgendes geschrieben: | Was ist daran so schwer? |
Das man dann immer noch nicht weiss, ob die Polygonzüge geschlossen sind.
_________________ Na denn, dann. Bis dann, denn.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 30.06.08 20:31
Dazu muss man einzig prüfen, ob der Graph nicht kreisfrei ist 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mo 30.06.08 20:34
Und schon wirds kompisiert. 
_________________ Na denn, dann. Bis dann, denn.
|
|
|