Переделал код. Ввёл приделы для поиска. Но до конца доделать, лень.
Выкладываю, может каму пригодиться. Что-то типа программы распознания,изображения.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Image1: TImage;
Image2: TImage;
RichEdit1: TRichEdit;
RichEdit2: TRichEdit;
Timer1: TTimer;
TabSheet2: TTabSheet;
RichEdit3: TRichEdit;
Image3: TImage;
RichEdit4: TRichEdit;
procedure risov(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
public
end;
var
Form1: TForm1;
str,s:string;
PZUv,r,s1,r1:string;
a:array [-1..300,-1..300]of string;
PZU:array[1..3,1..3] of string;
OZU:array[0..500]of string;
k:integer;
implementation
procedure TForm1.risov(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
n: string;
begin
if GetAsyncKeyState(VK_SPACE )<>0 then
begin
x:=trunc(X/3);
y:=trunc(y/3);
image2.Canvas.Pixels[x,y]:=0;
image1.Canvas.Ellipse(x*3+1,y*3+1,x*3-1,y*3-1);
n:=a[x,y];
if length(n)<4 then
a[x,y]:='1000'
else
begin
a[x,y][1]:= '1';
end;
n:=a[x-1,y];
if length(n)<4 then
a[x-1,y]:='0100'
else
begin
a[x-1,y][2]:= '1';
end;
n:=a[x,y-1];
if length(n)<4 then
a[x,y-1]:='0010'
else
begin
a[x,y-1][3]:= '1';
end;
n:=a[x-1,y-1];
if length(n)<4 then
a[x-1,y-1]:='0001'
else
begin
a[x-1,y-1][4]:= '1';
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
richedit1.Clear;
richedit2.Clear;
richedit3.Clear;
richedit4.Clear;
s:='1';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
x,y:integer;
x1,y1:integer;
xmin,xmax,ymin,ymax:integer;
n,nn:string;
i,j,npp,m:integer;
begin
image3.Picture:=nil;
image1.Enabled:=false;
richedit1.Clear;
richedit2.Clear;
richedit3.Clear;
richedit4.Clear;
str:='';
xmin:=300;
xmax:=0;
ymin:=300;
ymax:=0;
n:='';
npp:=1;
for y1:=1 to 300 do
for x1:=1 to 300 do
if (length(a[x1,y1])=4)and (a[x1,y1]<>'1001')and (a[x1,y1]<>'0110')and (a[x1,y1]<>'1111')then
begin
x:=x1;
y:=y1;
image3.Canvas.MoveTo(x*3,y*3);
repeat
n:=a[x,y];
if (n<>'0110')and (n<>'1001') then
a[x,y]:=a[x,y]+'1';
if (n<>'0110')and (n<>'1001') then
begin
if (n[4]='1')and (n[3]='0') then
begin
y:=y+1;
end;
if (n[2]='1')and (n[4]='0') then
begin
x:=x+1;
end;
if (n[1]='1')and (n[2]='0') then
begin
y:=y-1;
end;
if (n[3]='1')and (n[1]='0') then
begin
x:=x-1
end;
end
else
begin
if n='0110' then
begin
if (nn[4]='1')and (nn[3]='0') then
begin
x:=x+1;
n:='0100';
end;
if (nn[1]='1')and (nn[2]='0') then
begin
x:=x-1;
n:='0010';
end;
end;
if n='1001' then
begin
if (nn[3]='1')and (nn[1]='0') then
begin
y:=y+1;
n:='0001';
end;
if (nn[2]='1')and (nn[4]='0') then
begin
y:=y-1;
n:='1000';
end;
end;
end;
image3.Canvas.LineTo(x*3,y*3);
if x<xmin then
xmin:=x;
if x>xmax then
xmax:=x;
if y<ymin then
ymin:=y;
if y>ymax then
ymax:=y;
str:=str+inttostr(strtoint(n[1])+strtoint(n[2])+strtoint(n[3])+strtoint(n[4]));
nn:=n;
until (x1=x) and (y1=y);
nn:='0';
image3.Canvas.Pixels[x1*3,y1*3]:=clred;
repeat
i:=pos('22',str);
if i<>0then
begin
delete(str,i,1);
end;
until i=0;
k:=1;
r:=inttostr(trunc(10000/length(str))*length(str));
repeat
if length(r)<5then
r:='0'+r;
until length(r)=5;
repeat
if length(s)<5 then
s:='0'+s;
until length(s)=5;
repeat
i:=strtoint(str[k]);
if k<>length(str)then
j:=strtoint(str[k+1])
else
j:=strtoint(str[1]);
PZUv:=PZU[i,j];
for m:=1 to 499 do
begin
s1:=copy(OZU[m],1,5);
if length(OZU[m])<10then
break;
if pos(s1,PZUv)<>0 then
begin
r1:=copy(OZU[m],7,5);
delete(OZU[m],7,6);
r1:=inttostr(strtoint(r1)+strtoint(copy(PZUv,pos(s,PZUv)+7,5)));
delete (PZUv,1,12);
if strtoint(r1)>99999 then
r1:='99999';
repeat
if length(r1)<5then
r1:='0'+r1;
until length(r1)=5;
OZU[m]:=OZU[m]+r1+' ';
end;
end;
for m:=1 to 499 do
if length(OZU[m])<10 then
if length(PZUv)>10 then
begin
OZU[m]:=copy(PZUv,1,12);
delete (PZUv,1,12);
end
else
break;
k:=k+1;
until k >length(str);
OZU[0]:='';
for m:=1 to 499 do
if length(OZU[m])>10 then
begin
r1:= copy(OZU[m],7,5);
if (strtoint(r1)<11000) and (strtoint(r1)>9900)then
OZU[0]:=OZU[0]+OZU[m];
OZU[m]:='';
end
else
break;
if (strtoint(r)<11000) and (strtoint(r)>9900)then
if pos(r,OZU[0])=0 then
begin
OZU[0]:=OZU[0]+s+' '+r+' ';
k:=1;
repeat
i:=strtoint(str[k]);
if k<>length(str)then
j:=strtoint(str[k+1])
else
j:=strtoint(str[1]);
r1:=inttostr(trunc(10000/length(str)));
repeat
if length(r1)<5then
r1:='0'+r1;
until length(r1)=5;
if pos(r1,PZU[i,j])=0 then
begin
PZU[i,j]:=PZU[i,j]+s+' '+r1+' ';
npp:=2;
end;
k:=k+1;
until k >length(str);
end;
if npp=2 then
begin
s:=inttostr(strtoint(s)+1);
npp:=1;
end;
RichEdit2.Lines.Add(OZU[0]);
str:='';
end;
for y1:=1 to 300 do
for x1:=1 to 300 do
if length(a[x1,y1])=5 then
begin
a[x1,y1]:=copy(a[x1,y1],1,4);
end;
image1.Enabled:=true;
end;
end.
|