Einzelnen Beitrag anzeigen

Frida

Registriert seit: 15. Nov 2006
6 Beiträge
 
Delphi 6 Professional
 
#1

Anteil eines Werts in einem Umkreis bestimmen

  Alt 15. Nov 2006, 11:58
Moin,

ich möchte für jeden Punkt einer Karte den Anteil eines Wertes innerhalb eines Radius um den Punkt bestimmen. Um das ganze zu veranschaulichen: Ich habe eine Landkarte, in der eigetragen ist, ob ein Pixel bebaut ist oder eben nicht. Nun möchte ich für jedes Pixel berechnen, wie hoch der Anteil bebauter Fläche innerhalb eines Kreises um diesen Punkt herum ist.
Das funktioniert auch gut, dauert auch gar nicht so lange, aber da ich mit recht großen Arrays arbeite und das ganze für viele verschiedene Radien mache, summiert sich die Rechenzeit doch zu einer beträchtlichen Länge. Hat jemand eine Idee, wie man das ganze schneller machen kann?
Hier kommt der Code, mit dem ich es bisher berechen:

Delphi-Quellcode:
procedure CalcLandContext(radius : integer; const InData : TIntArray; var OutData : TDoubleArray);
var
  dr2 : integer;
  i, j, ii, jj, nx, ny, n, a : integer;
  ncol, nrow : integer;
begin
  // InData ist ein Array mit 0 für unbebaut und 1 für bebaut, -9999 steht für NoDataValue
  ncol := Length(InData);
  nrow := Length(InData[0]);
  SetLength(OutData, ncol, nrow);
  for j:=0 to High(OutData[0]) do
    begin
    for i:=0 to High(OutData) do
      begin
      if InData[i,j] = -9999 then
        OutData[i,j]:=-9999
      else
        begin
        n:=0;
        a:=0;
        for nx:=-radius-1 to radius+1 do
          begin
          for ny:=-radius-1 to radius+1 do
            begin
            ii := i+nx;
            jj := j+ny;
            if (ii>=0) and (ii<ncol) and (jj>=0) and (jj<nrow) //nicht über Ränder
              then begin
              dr2 := nx*nx+ny*ny;
              if dr2 <= sqr(radius)
                then begin
                if InData[ii,jj] = 1 then
                  inc(n);
                inc(a);
                end;
              end;
            end;
          end;
          OutData[i,j] := 100*n/a;
        end;
      end;
    end;
end;
Ist es vielleicht besser, das Array erst in eine Bitmap umzuwandel und dann Farbwerte zu vergleichen? Oder gibt's eine Funktion ähnlich FlodFill, die auch mitzählt, wieviele Pixel sie einfärbt?

Wäre super, wenn irgendjemand ein paar Tipps für mich hätte.
  Mit Zitat antworten Zitat