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.