Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
Delphi 11 Alexandria
|
Re: Berechnung von "Rissen" in einem Bild
20. Mär 2008, 12:50
Hallo 3_of_8,
ist das Problem noch aktuell? Ich habe leider gerade keine Zeit, mich daran zu versuchen, trotzdem mal ein paar Überlegungen...
In Deinem Code vermisse ich die Prüfung, ob ein Riß besteht und dieser durchgehend ist. Erst wenn das feststeht lohnt sich die Aufteilung in Gruppen (oder Bereiche).
Also ich würde das (nach jetzigen Überlegungen) so angehen:
1.) Vorbereitung
- globale Variable MaxBereich=0
- globale Variable RißNr=0
- jedem Punkt wird der Bereich 0 zugewiesen
- jedem Punkt wird die Stabilität 8 zugewiesen
- jeder Punkt erhält die Eigenschaft RissNr=0
- jeder Punkt erhält die Eigenschaft Used=False
2.) KillPoint
- KLickPoint.Bereich in gobale Variable OriginalBereich speichern
- im Umkreis von 4 Pixeln wird die Stabilität um 4..1 Pixel vermindert
- wenn Stabilität auf 0 fällt, wird der Punkt gekillt (rekursiv)
(sonst hier noch nichts weiter machen)
3.) jetzt auf durchgehenden Riß testen (vom KlickPoint aus)
- globale Variablen Endlos1 und Endlos 2 auf False
- Point.Used:=True
- rekursiv alle benachbarten Punkte testen, ob sie gekillt sind nicht Used
-> wenn ja: wenn Rand erreicht ist oder der KillPunkt.RißNr>0 (oder als Sonderfall der Ausgangspunkt) dann Endlos1 auf True, Rekursion dieser Richtung abbrechen
-> sonst: weiter rekursiv testen
=> am Ende jeden rekursiven Aufrufes "rückwärts" Used wieder auf False
- wenn Endlos1=True weitere Richtung testen für Endlos2
- alle gefundenen KillPunkte bei dieser Suche in eine Liste speichern
- wenn Endlos1 und Endlos2 = True ist der Riss durchgehend
! IF RißNichtDurchgehend THEN GOTO 6.)
4.) Riß verwalten
- Globale Variable RißNr erhöhen
- allen Punkten aus der gefundenen Riß-Liste die RißNr zuweisen
5.) Bereiche zuweisen
- Globale Variable MaxBereich erhöhen
- vom KlickPoint aus alle umgebenenden Punkte Used auf True und testen, ob sie dem OriginalBereich entsprechen
-> dann rekursiv Used auf True und Point.Bereich := MaxBereich
=> am Ende jeden rekursiven Aufrufes "rückwärts" Used wieder auf False
6.) Riß-Liste wieder freigeben
Schade, dass ich gerade nicht selbst dafür Zeit habe...
stahli
|