Замкнутая область задается границей определенного цвета или цветным пятном.
Простейший алгоритм заполнения называется алгоритм кораеда.
Алгоритм:
- Добавить начальную полоску в список
- Цикл, пока список не пустой
- берем первую точку из списка(удаляем ее)
- закрашиваем взятую точку
- проверяем 4 точки вокруг и если их цвет не совпадает с цветом границыи она не закрашена, то добавляем ее в список.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, jpeg, ExtCtrls, ColorGrd;
type
Stek = ^St;
St=record
x,y:integer;
Next:Stek;
end;
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
first:stek;{ Public declarations }
C1,C2:TColor;
procedure Add (X1,Y1:integer);
procedure Del (var X1,y1:integer);
end;
var
Form1: TForm1;
MD: boolean;
implementation
{$R *.DFM}
procedure TForm1.Add(X1, Y1: integer);
var
elem:Stek;
begin
New (elem);
elem.x:=X1;
elem.y:=Y1;
elem.Next:=first;
first:=elem;
end;
procedure TForm1.Del(var X1, y1: integer);
var
x,y:integer;
elem:Stek;
begin
if first <> nil then
begin
x1:=first.x;
y1:=first.y;
elem:=first;
first:=first.Next;
dispose (elem);
end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
X1,y1:integer;
begin
if Button=mbleft then
begin
MD:=true;
Image1.Canvas.MoveTo(x,y);
end
else
begin
c2:=Image1.Canvas.Pixels[x,y];
c1:=RGB(random(255),random(255),random(255));
first:=nil;
Add(x,y);
while (first <> nil) do
begin
Del (x1,y1);
Image1.Canvas.Pixels[x1,y1]:=C1;
if (Image1.Canvas.Pixels[x1,y1-1]=C2) then
Add (x1,Y1-1);
if (Image1.Canvas.Pixels[x1,y1+1]=C2) then
Add (X1,Y1+1);
if (Image1.Canvas.Pixels[x1-1,y1]=C2)then
Add (x1-1,y1);
if (Image1.Canvas.Pixels[x1+1,y1]=C2) then
Add (x1+1,y1);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
first:=nil;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MD then
Image1.Canvas.LineTo(x,y);
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MD:=false;
end;
end.
Похожие записи
No user прокомментировали сообщение
Оставить комментарий