Einzelnen Beitrag anzeigen

mr_emre_d
(Gast)

n/a Beiträge
 
#1

Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 20:34
Hallo liebe Leute,

Ich bin grad schon länger dabei ein Headtracking Programm nachzuschreiben es funktioniert halt auch alles bis auf die Geschwindigkeit des FIlters( hab ne eigene Methode dafür geschrieben )

Jetzt denk ich mir halt ich machs mit floodfill nur nicht mit der schon definierten sondern mit einer eigenen, weil ich nach jedem Schrit die Koordinaten abspeichern will .. -- temporär - versteht sich

hier der daweilige code:

Code:
procedure TForm1.rFloodFill(bmp: TBitmap; Pos: TPoint; Color: TColor);
var
  GColor: TColor; // Get Color
  abs: Byte; // Abstände
  function CheckKol: Boolean;
  begin
    Result:= false;
    if ( pos.X < 1 ) and ( pos.x > bmp.Width - 1 ) and
       ( pos.y < 1 ) and ( pos.y > bmp.Height - 1 )
    then
      Result:= True; // sie ist an der wand !
  end;
begin
  abs:= 2;
  try

  if not CheckKol then
  with pos do
  begin
    if ( not Setted[pos.x-abs,pos.Y] ) and
       ( not ( bmp.Canvas.Pixels[pos.x-abs, pos.y] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x-abs, pos.y] = ClickedColor ) then
    begin
      bmp.Canvas.pixels[pos.x-abs,pos.Y]:= Color;
      Setted[pos.X-abs,pos.Y]:= true;
      rFloodFill( bmp, point( x - abs, y ), Color );
    end else
      exit;

    if ( not Setted[pos.x,pos.Y+abs] ) and
       ( not ( bmp.Canvas.Pixels[pos.x, pos.y+abs] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x, pos.y+abs] = ClickedColor ) then // ist in public definiert, zeigt die erste farbe an !
    begin
      bmp.Canvas.pixels[pos.x,pos.Y+abs]:= Color;
      Setted[pos.X,pos.Y+abs]:= true;
      rFloodFill( bmp, point( x, y+abs ), Color );
    end else
      exit;

    if ( not Setted[pos.x+abs,pos.Y] ) and
       ( not ( bmp.Canvas.Pixels[pos.x+abs, pos.y] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x+abs, pos.y] = ClickedColor ) then
    begin
      bmp.Canvas.pixels[pos.x+abs,pos.Y]:= Color;
      Setted[pos.X+abs,pos.Y]:= true;
      rFloodFill( bmp, point( x + abs, y ), Color );
    end else
      exit;

    if ( not Setted[pos.x,pos.Y-abs] ) and
       ( not ( bmp.Canvas.Pixels[pos.x, pos.y-abs] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x, pos.y-abs] = ClickedColor ) then
    begin
      bmp.Canvas.pixels[pos.x,pos.Y-abs]:= Color;
      Setted[pos.X,pos.Y-abs]:= true;
      rFloodFill( bmp, point( x, y-abs ), Color );
    end else
      exit;
  end;
  except

  end;
end;
ich habs geschafft, dass ich es von 9 Sekunden auf 3 runterbringe nur reicht das immernoch nicht... uund es sind noch n paar Fehler wahrschinlich drinnen + hab gerade jetzt kommentiert also entschuldige ich mich schon im voraus für die Fehler !

MfG
  Mit Zitat antworten Zitat