Entwickler-Ecke
Multimedia / Grafik - angrenzende, gleiche elemente finden
CyTe - Fr 18.04.03 20:36
Titel: angrenzende, gleiche elemente finden
Geg.: 2-dimensionalen array, in dem jeder punkt einen der werte 0, 1, 2 oder 3 trägt
Ges.: wie lösche ich alle waagrecht oder senkrecht (nicht diagonal) an einen bestimmten punkt angrenzenden GLEICHEN punkte? auch punkte die an die gelöschten punkte angrenzen, sollen bei bedarf gelöscht werden.
Sunreader - Fr 18.04.03 21:35
Hört sich auf jeden fall nach rekursiver programmierung an (hoffe, dass das das :roll: richtige wort ist)
So viel Erfahrung hab ich allerdings nicht damit...
maximus - Fr 18.04.03 22:27
Hoodi...
was verstehst du unter löschen? Wenn du wild einträge löscht, dann sind sind die dimensionen deines arrays nicht mehr intakt! -> weiss nicht ob du dass willst?
@rekursiv: nette idee...is aber nicht nötig. Einfach zwei for-schleifen für x und y ...dann immer [x+1,y] und [x,y+1] auf gleichheit mit [x,y] prüfen. dann löschen oder was immer :wink:
Sunreader - Sa 19.04.03 12:51
Aber ich denke die rekursion ist deshalb nötig, weil ja wenn ein gleicher Nachbar gefunden wurde überprüft werden soll ob davon wiederum ein Nachbar gleich ist, usw, usf...
| Zitat: |
| auch punkte die an die gelöschten punkte angrenzen, sollen bei bedarf gelöscht werden. |
Sunreader - Sa 19.04.03 13:09
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| var feld : array [1..100,1..100] of byte; aktfeldx, aktfeldy: word;
function pruefe([x,y): boolean;
//main-procedure if pruefe(aktfeldx,aktfeldy) = true then feld[aktfeldx,aktfeldy] := 0;
function pruefe(x,y) :boolean; begin if feld[x,y] = feld[aktfeldx,aktfeldy] then begin
if pruefe(x+1,y) = true then feld[x+1,y]:= 0;
if pruefe(x-1,y) = true then feld[x-1,y]:= 0;
if pruefe(x,y+1) = true then feld[x,y+1]:= 0;
if pruefe(x,y-1) = true then feld[x,y-1]:= 0; pruefe := true end; end; |
Geht das so in etwa @experten?
maximus - Sa 19.04.03 13:35
Wenn das so ist...dann könntest du recht haben :oops: Dein code bedarf aber noch ein paar änderungen...bevor er workt: :roll:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| var feld : array [1..100,1..100] of byte; aktfeldx, aktfeldy: word;
procedure pruefung; var x,y:integer; begin //main-procedure for x := 0 to length(...)-1 do for y := 0 to length(...)-1 do pruefe(x,y); end;
procedure pruefe(x,y); begin if (x < length(..)-1) and (y < length(..)-1) then begin if feld[x,y] = feld[x+1,y] then begin pruefe(x+1,y); feld[x+1,y] := 0; end; if feld[x,y] = feld[x,y+1] then begin pruefe(x,y+1); feld[x+1,y] := 0; end; end; if (x > 0) and (y > 0) then begin // hier den ganzen spass für xy-1 end; end; |
WICHTIG: man sollte darauf achten, dass der stack nicht überläuft...da sich die rekursion hier sehr schnell im kreis drehen kann! ggf. nur für xy+1 laufen lassen. Oder ein zweites array anlegen, dann braucht man aber auch keine rekursion 8)
Sunreader - Sa 19.04.03 14:57
8)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!