Autor Beitrag
Geri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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 user profile iconNarses: Überzähligen Dateianhang gelöscht
Einloggen, um Attachments anzusehen!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 30.06.08 20:25 
user profile iconBenBE 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 30.06.08 20:34 
Und schon wirds kompisiert. :hair:

_________________
Na denn, dann. Bis dann, denn.