Wenn mit einer Liste gearbeitet wird, so würde ich diese sortieren.
Delphi-Quellcode:
function CompareData(AItem1, AItem2: Pointer): Integer;
begin
Result := TData(AItem1^).y - TData(AItem2^).y;
if Result = 0 then
Result := TData(AItem1^).x - TData(AItem2^).x;
end;
FList.Sort(CompareData);
Dadurch lässt sich die Anzahl der Zugriffe auf die Elemente drastisch reduzieren.
Delphi-Quellcode:
function ComparePoint(AItem: TData; X, Y: Integer): Integer;
begin
Result := AItem.Y - Y;
if Result = 0 then
Result := AItem.X - X;
end;
function FindPointDown(idx: Integer; X, Y: Integer): Boolean;
var
iComp: Integer;
begin
for i := idx - 1 downto 0 do
begin
iComp := ComparePoint(Get(idx), x, y);
if iComp = 0 then
begin
Result := True;
Exit;
end;
if iComp < 0 then
begin
Result := False;
Exit;
end;
end;
Result := False;
end;
function FindPointUp(idx: Integer; X, Y: Integer): Boolean;
var
iComp: Integer;
begin
for i := idx + 1 to FList.COunt - 1 do
begin
iComp := ComparePoint(Get(idx), x, y);
if iComp = 0 then
begin
Result := True;
Exit;
end;
if iComp > 0 then
begin
Result := False;
Exit;
end;
end;
Result := False;
end;
Function IsRand(idx: Integer): Boolean;
var
Item: TData;
begin
with Get(idx) do
begin
Result := FindPointDown(idx, x - 1, Y) and
FindPointUp(idx, x + 1, Y) and
FindPointDown(idx, x, Y - 1) and
FindPointUp(idx, x, Y + 1);
end;
end;
Zugriffe auf Pixels sind so ziemlich das langsamste was es gibt bei Bitmaps.
Wenn das Speicherformat bekannt ist, kann man die Bitmap direkt über Scannline ändern.
Hier noch ein Link zum Thema allgemein:
http://www.codeproject.com/KB/GDI/Qu...select=1306625