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)