找色和色块,是模拟的重要基础。
有时候,需要确定某点是否出现某种颜色,有时候需要判断色块是否出现在某位置
有时候,需要看范围内是否出现色块。
function IsColor(bmp:TBitmap; x,y:integer; c:TColor):boolean;
var
row:pRGBTripArray;
p:TRGBTriple;
begin
row:=bmp.ScanLine[y];
p:=row[x];
result:=(p.rgbtBlue=GetBValue(c)) and (p.rgbtGreen=GetGValue(c))
and (p.rgbtRed=GetRValue(c));
end;
function IsColorBlock(bmp:TBitmap; x,y,n:integer; c:TColor):boolean;
var
i,j:integer;
begin
result:=false;
for j:=y to y+n-1 do
begin
for i:=x to x+n-1 do
begin
if not IsColor(bmp, i, j, c) then // 颜色不对就不是色块了
exit;
end;
end;
result:=true; // 能到这里,该位置就是色块
end;
function FindColorBlock(bmp:TBitmap; x1,y1,x2,y2,n:integer;c:TColor):TPoint;
var
i,j:integer;
begin
for j:=y1 to y2 do
begin
for i:=x1 to x2 do
begin
if IsColor(bmp, i, j, c) then // 先找色点
begin
if IsColorBlock(bmp,i,j,3,c) then // 再判色块
begin
result.x:=i;
result.y:=j;
exit; // 找到返回
end;
end;
end;
end;
result.x:=-1;
result.y:=-1;
end;