Image2->Canvas->LineTo(int(zoom*i),int(zoom*j));
if(apix[i][j][1]>0) // пересечение узла с линией
{
Image2->Canvas->MoveTo(int(zoom*i),int(zoom*j));
Image2->Canvas->LineTo(int(zoom*(i+1)),int(zoom*(j+1)));
}
} // for j
} // for i
//
Image2->Canvas->Pen->Color=c4;
Image2->Canvas->MoveTo(int(zoom*p.x),int(zoom*p.y));
Image2->Canvas->LineTo(int(zoom*(p.x+1)),int(zoom*p.y));
Image2->Canvas->LineTo(int(zoom*(p.x+1)),int(zoom*(p.y+1)));
Image2->Canvas->LineTo(int(zoom*p.x),int(zoom*(p.y+1)));
Image2->Canvas->LineTo(int(zoom*p.x),int(zoom*p.y));
} // actSegLightCheck->Checked
//---------------------------------------------------------------------------
void TfrmLineSeg::ShowInfo(int X,int Y)
unsigned char r,g,b;
int ix=int(X/zoom),iy=int(Y/zoom);
if (X>=0 && Y>=0)
sb1->Panels->Items[1]->Text=IntToStr(ix);
sb1->Panels->Items[3]->Text=IntToStr(h-1-iy);
r=Image1->Canvas->Pixels[ix][iy];
g=Image1->Canvas->Pixels[ix][iy] >>8;
b=Image1->Canvas->Pixels[ix][iy] >>16;
sb1->Panels->Items[5]->Text=IntToStr(r);
sb1->Panels->Items[7]->Text=IntToStr(g);
sb1->Panels->Items[9]->Text=IntToStr(b);
sb1->Panels->Items[11]->Text=IntToStr(int(zoom));
// if(apix[ix][iy][0]!=-1)
sb1->Panels->Items[13]->Text=IntToStr(apix[ix][iy][0]);
sb1->Panels->Items[15]->Text=IntToStr(apix[ix][iy][1]);
sb1->Panels->Items[17]->Text=IntToStr(apix[ix][iy][2]);
sb1->Panels->Items[19]->Text=IntToStr(apix[ix][iy][3]);
void __fastcall TfrmLineSeg::actZoom1Execute(TObject *Sender)
zoom=1.0f;
Image1->Width=Image1->Picture->Width;
Image1->Height=Image1->Picture->Height;
DrawGrid();
void __fastcall TfrmLineSeg::actAnalyzeExecute(TObject *Sender)
MemoLog->Clear();
actAnalyzeNodeExecute(Sender);
actAnalyzeSegExecute(Sender);
int __fastcall TfrmLineSeg::NeigCount(int x, int y)
int n=0;
if(Image1->Canvas->Pixels[x-1][y-1]==c0 && x>0 && y>0) n+=1; // lu=1
if(Image1->Canvas->Pixels[x ][y-1]==c0 && y>0) n+=1; // u=2
if(Image1->Canvas->Pixels[x+1][y-1]==c0 && x<w && y>0) n+=1; // ru=3
if(Image1->Canvas->Pixels[x-1][y ]==c0 && x>0 ) n+=1; // l=4
if(Image1->Canvas->Pixels[x+1][y ]==c0 && x<w ) n+=1; // r=5
if(Image1->Canvas->Pixels[x-1][y+1]==c0 && x>0 && y<h) n+=1; // ld=6
if(Image1->Canvas->Pixels[x ][y+1]==c0 && y<h) n+=1; // d=7
if(Image1->Canvas->Pixels[x+1][y+1]==c0 && x<w && y<h) n+=1; // rd=8
return (n);
int TfrmLineSeg::VectMove(int &x, int &y, int vect)
int res=0;
if(vect>0) wlog("VectMove: new point");
else if(vect<0 && vect>-10) wlog("VectMove: new node");
else if(vect<-10 && vect>-20) wlog("VectMove: existing node");
else wlog("VectMove: ERROR POINT");
int amvect=abs(vect) % 10;
switch(amvect)
// точка принадлежит линии
case 1: x-=1; y-=1; res=1; break;
case 2: y-=1; res=1; break;
case 3: x+=1; y-=1; res=1; break;
case 4: x-=1; res=1; break;
case 5: x+=1; res=1; break;
case 6: x-=1; y+=1; res=1; break;
case 7: y+=1; res=1; break;
case 8: x+=1; y+=1; res=1; break;
return res;
void __fastcall TfrmLineSeg::FormCanResize(TObject *Sender, int &NewWidth,
int &NewHeight, bool &Resize)
if(NewHeight<300) Resize=false;
void TfrmLineSeg::ZoomTo(double z)
if(z<0.1) zoom=0.1f;
else if(z>maxzoom) zoom=maxzoom;
else zoom=z;
Image1->Width=int(Image1->Picture->Width*zoom);
Image1->Height=int(Image1->Picture->Height*zoom);
ShowInfo(-1,-1);
AnsiString TfrmLineSeg::VectToStr(int v)
switch(v)
case 1:return ("LU");
case 2:return ("U");
case 3:return ("RU");
case 4:return ("L");
case 5:return ("R");
case 6:return ("LD");
case 7:return ("D");
case 8:return ("RD");
case -1:return ("LUn");
case -2:return ("Un");
case -3:return ("RUn");
case -4:return ("Ln");
case -5:return ("Rn");
case -6:return ("LDn");
case -7:return ("Dn");
case -8:return ("RDn");
default:return("");
void __fastcall TfrmLineSeg::actNewFileExecute(TObject *Sender)
if(frmImgSize->ShowModal()==mrOk)
try
w=StrToInt(frmImgSize->edtWidth->Text);
h=StrToInt(frmImgSize->edtHeight->Text);
Image1->Picture->Bitmap->Width=w;
Image1->Picture->Bitmap->Height=h;
Image1->Width=w;
Image1->Height=h;
Image1->Canvas->FillRect(Image1->ClientRect);
scb1->Enabled=true;
for(int i=0;i<=w-1;i++) // maxw-1
for(int j=0;j<=h-1;j++) // maxh-1
apix[i][j][0]=Image1->Canvas->Pixels[i][j]==c0?1:0;
apix[i][j][1]=apix[i][j][2]=-1;
catch (...)
MessageBox(Handle,"Неверно указано число", "Ошибка", MB_OK);
void __fastcall TfrmLineSeg::actGridCheckExecute(TObject *Sender)
ValidateView();
void __fastcall TfrmLineSeg::actLightCheckExecute(TObject *Sender)
void __fastcall TfrmLineSeg::actZoom10Execute(TObject *Sender)
ZoomTo(10.0f);
void __fastcall TfrmLineSeg::actLineLightCheckExecute(TObject *Sender)
void TfrmLineSeg::wlog(AnsiString s)
if(logs)
if(s!="")
MemoLog->Lines->Add(s);
void __fastcall TfrmLineSeg::actSegLightCheckExecute(TObject *Sender)
void TfrmLineSeg::ValidateView()
double TfrmLineSeg::plDistance(double x,double y,double x1,double y1,double x2,double y2)
double R=0.0f;
R=((y1-y2)*x+(x2-x1)*y+(x1*y2-x2*y1))/sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
catch(...)
{ }
return fabs(R);
void __fastcall TfrmLineSeg::actLockViewExecute(TObject *Sender)
AnsiString TfrmLineSeg::StrToLen(AnsiString str, int len)
AnsiString s=str;
while(s.Length()<len) s=" "+s;
return s;
void __fastcall TfrmLineSeg::NeigNode(int x, int y, int n)
void __fastcall TfrmLineSeg::actAnalyzeNodeExecute(TObject *Sender)
sb1->SimplePanel=true; sb1->SimpleText="Поиск узлов ...";
AnsiString s;
TPoint p;
int i,j,x,y,x1,y1,x2,y2,ssize,nsegs, v,oldv;
for(i=0;i<=w-1;i++) // maxw-1
for(j=0;j<=h-1;j++) // maxh-1
apix[i][j][2]=-1;
i=0; j=0;
nsegs=0;
wlog("Поиск узлов ...");
while(j<h)
while(i<w)
if( apix[i][j][0]==1 // есть точка
&& apix[i][j][2]==-1 // не обработана на принадлежность узлу
&& NeigCount(i,j)>2 ) // является частью узла
{// начинаем выделение узла
nsegs+=1;
wlog("Найден узел №"+IntToStr(nsegs));
// wlog("Точки в области узла:");
NeigNode(i,j,nsegs); // обрабатываем точки вокруг узла
p=NodeCentre(nsegs);
wlog("Координаты узла: "+IntToStr(p.x)+","+IntToStr(h-1-p.y));
i+=1;
} // while i
i=0; j+=1;
} // while j
wlog("Поиск узлов завершен");
wlog("ВСЕГО УЗЛОВ: "+IntToStr(nsegs));
sb1->SimpleText=""; sb1->SimplePanel=false;
void __fastcall TfrmLineSeg::NeigLine(int x,int y, int n)
int nc=NeigCount(x,y);
if(nc==1 || nc==2) // если начало или продолжение линии
apix[x][y][1]=n;
wlog(IntToStr(x)+","+IntToStr(h-1-y));
// если ( есть точка И не обработана на принадлежность линии )
if(apix[x-1][y-1][0]==1 && apix[x-1][y-1][1]==-1) NeigLine(x-1,y-1,n);
if(apix[x ][y-1][0]==1 && apix[x ][y-1][1]==-1) NeigLine(x ,y-1,n);
if(apix[x+1][y-1][0]==1 && apix[x+1][y-1][1]==-1) NeigLine(x+1,y-1,n);
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18