Announcement

Collapse
No announcement yet.

Benachbarte Felder einer Matrix

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Benachbarte Felder einer Matrix

    Hallo,

    kennt jemand eine 'Floodfill'-Methode für eine 2D-Matrix?

    Ich möchte von einem Punkt der Matrix die Umgebung untersuchen. Alle Felder gleichen Inhaltes sollen markiert werden. Das war's.
    Suche mir schon die 'Finger' wund und stehe mit der Rekursion so
    leicht auf Kriegsfuß ;-(

    Danke für Eure Hilfe

    Thomas Stahmer

  • #2
    Hallo Thomas,<br>
    ich habe Dir ein kleines Beispielprogramm geschrieben.<br>
    Das Programm incl. der Rasterkomponente findest Du unter<br>
    http://home.t-online.de/home/jensschumann/raster/sraster.zip<br>
    <br>
    Hier der Code, falls du keine Lust hast das downzuloaden.<br>
    <pre>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
    Dialogs, AGRaster_1, StdCtrls;

    type
    TRadar = Array [0..7] of TPoint;

    TForm1 = class(TForm)
    Raster: TAGRaster_1;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure RasterCellPaint(Sender: TObject; Cell: TAGRasterCell;
    Canvas: TCanvas);
    procedure RasterCellClick(Sender: TObject; Cell: TAGRasterCell);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    private
    { Private-Deklarationen }
    PtStart : TPoint;
    FRadar : TRadar;
    FStop : Boolean;
    FCmpStr : String;
    procedure FillRaster;
    procedure FindCell(X,Y : Integer);
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    { TForm1 }

    procedure TForm1.FillRaster;
    var
    X : Integer;
    Y : Integer;
    begin
    For X:=0 to Raster.Grid.ColCount-1 do
    For Y:=0 to Raster.Grid.RowCount-1 do
    Raster.Grid.Cells[X,Y].T:=IntToStr(Random(3));
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    FillRaster;
    FRadar[0]:=Point(0,-1); // oben;
    FRadar[1]:=Point(1,-1); // rechts oben
    FRadar[2]:=Point(1,0); // rechts;
    FRadar[3]:=Point(1,1); // rechts unten
    FRadar[4]:=Point(0,1); // unten;
    FRadar[5]:=Point(-1,1); // unten links
    FRadar[6]:=Point(-1,0); // links
    FRadar[7]:=Point(-1,-1); // links oben
    end;

    procedure TForm1.RasterCellPaint(Sender: TObject; Cell: TAGRasterCell;
    Canvas: TCanvas);
    var
    aCellRect : TRect;
    begin
    aCellRect:=Cell.CellRect;
    InflateRect(aCellRect,-1,-1);
    With Canvas do
    begin
    If Cell.Tag=1 then
    begin
    Brush.Color:=clLime;
    Brush.Style:=bsSolid;
    Pen.Color:=clLime;
    Pen.Width:=1;
    RecTangle(aCellRect);
    end
    else
    begin
    Brush.Color:=clWhite;
    Brush.Style:=bsSolid;
    Pen.Color:=clWhite;
    Pen.Width:=1;
    RecTangle(aCellRect);
    end;
    DrawText(Handle,PChar(Cell.T),-1,aCellRect,dt_singleline+dt_center+dt_vcenter);
    end;
    end;

    procedure TForm1.RasterCellClick(Sender: TObject; Cell: TAGRasterCell);
    begin
    Raster.BeginUpdate;
    PtStart:=Point(Cell.X,Cell.Y);
    Label2.Caption:='X : '+IntToStr(Cell.X)+' Y : '+IntToStr(Cell.Y);
    Cell.Tag:=1;
    FCmpStr:=Cell.T;
    Raster.EndUpdate;
    end;

    procedure TForm1.FindCell(X, Y: Integer);
    var
    iCnt : Integer;
    begin
    For iCnt:=0 to 7 do
    begin
    Application.ProcessMessages;
    If FStop then Break;
    If (X+FRadar[iCnt].X&gt;=0) and (Y+FRadar[iCnt].Y&gt;=0) and
    (X+FRadar[iCnt].X&lt;=Raster.Grid.ColCount-1) and (Y+FRadar[iCnt].Y&lt;=Raster.Grid.RowCount-1) then
    If (Raster.Grid.Cells[X+FRadar[iCnt].X,Y+FRadar[iCnt].Y].T=FCmpStr) and
    (Raster.Grid.Cells[X+FRadar[iCnt].X,Y+FRadar[iCnt].Y].Tag&lt;&gt;1) then
    begin
    Raster.BeginUpdate;
    Raster.Grid.Cells[X+FRadar[iCnt].X,Y+FRadar[iCnt].Y].Tag:=1;
    Raster.EndUpdate;
    FindCell(X+FRadar[iCnt].X,Y+FRadar[iCnt].Y); // hier ist die Rekursion !!!
    end;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    iCnt : Integer;
    begin
    FStop:=False;
    Raster.BeginUpdate;
    For iCnt:=0 to Raster.Grid.RasterCells.Count-1 do
    Raster.Grid.RasterCells.Items[iCnt].Tag:=0;
    Raster.EndUpdate;
    FindCell(PtStart.X,PtStart.Y);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var
    iCnt : Intege

    Comment


    • #3
      <pre>
      begin
      Raster.BeginUpdate;
      For iCnt:=0 to Raster.Grid.RasterCells.Count-1 do
      Raster.Grid.RasterCells.Items[iCnt].Tag:=0;
      FillRaster;
      Raster.EndUpdate;
      end;

      procedure TForm1.Button3Click(Sender: TObject);
      begin
      FStop:=True;
      end;

      end.</pre&gt

      Comment

      Working...
      X