Рефераты. Система автоматизированного анализа пространственной структуры изображений. Подсистема линейной сегм...

// на продолжение линии n

// является рекурсивной

void __fastcall GetLineVect(int x,int y, int n);

// GetLineVect обрабатывает линию в код

// рекурсивная

TPoint NodeCentre(int n);

// NodeCentre возвращает центр узла n (координаты узловой точки)

void __fastcall FillLine(int n1, int n2);

// FillLine присваивает линии n2 пикселы линии n1 (объединение двух линий)

TPoint __fastcall FindMatch(int x, int y);

// FindMatch возвращает точку, соответствующую точке x,y

void __fastcall CodeLine(int x1,int y1,int x2,int y2);

// CodeLine добавляет в глобальную переменную linecode код для отрезка (x1,y1)-(x2,y2)

void __fastcall GetLineVect2(int x,int y, int n);

// GetLineVect2 обрабатывает линию в код

// рекурсивная

public:// User declarations

__fastcall TfrmLineSeg(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TfrmLineSeg *frmLineSeg;

//---------------------------------------------------------------------------

#endif

П.3.2. Текст модуля lineseg.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "LineSeg.h"

#include "lsImgSize.h"

#include "lsOptions.h"

#include <math.h>

#include <values.h>

#include <io.h>

#include <fcntl.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma link "PERFGRAP"

#pragma resource "*.dfm"

#define min(a, b)  (((a) < (b)) ? (a) : (b))

#define max(a, b)  (((a) > (b)) ? (a) : (b))

TfrmLineSeg *frmLineSeg;

double zoom,dzoom,maxzoom;

int w,h,def,defh,selline,selnode,oldselline,oldselnode,isnode;

const int maxw=1024,maxh=1024;

TColor c0,c1,c2,c3,c4,c21,c5;

bool logs; // вести журнал вычислений

int nodescnt,xs1,ys1,xs2,ys2,xs3,ys3;

AnsiString linecode; // содержит код текущей линии

// apix[i][j][0] - массив точек

// apix[i][j][1] - массив линий, номер линии

// apix[i][j][2] - массив узлов, номер узла

// -1 - пиксел не обработан, 0 - нет точки, >0 - номер линии, кот. принадлежит точка

// apix[i][j][3] - массив врЕменных атрибутов

int apix[maxw][maxh][4];

//---------------------------------------------------------------------------

__fastcall TfrmLineSeg::TfrmLineSeg(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::actExitExecute(TObject *Sender)

{

frmLineSeg->Close();

}

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::FormCreate(TObject *Sender)

{

scb1->Enabled=false;

logs=true;

zoom=1.0f; dzoom=1.0f;

maxzoom=100.0f;

selline=-1;

Image1->Left=0; Image1->Top=0;

Image2->Left=0; Image2->Top=0;

w=0; h=0;

c0=TColor(RGB(0,0,0)); c1=TColor(RGB(255,255,255));

c2=TColor(RGB(0,255,0)); c3=TColor(RGB(0,0,255));

c4=TColor(RGB(255,0,0)); c21=TColor(RGB(255,255,0));

c5=TColor(RGB(200,200,200));

for(int i=0;i<=maxw-1;i++)

for(int j=0;j<=maxh-1;j++)

{

apix[i][j][0]=0;

apix[i][j][1]=apix[i][j][2]=apix[i][j][3]=-1;

}

}

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::FormCloseQuery(TObject *Sender, bool &CanClose)

MB_DEFBUTTON2)==ID_YES;

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::actZoomInExecute(TObject *Sender)

{

zoom+=dzoom;

ZoomTo(zoom);

DrawGrid();

}

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::actZoomOutExecute(TObject *Sender)

{

if(zoom>dzoom) zoom-=dzoom;

ZoomTo(zoom);

DrawGrid();

}

//---------------------------------------------------------------------------

void TfrmLineSeg::DrawGrid()

{

if(Image2->Visible)

{

Image2->Picture->Bitmap->Width=Image1->Width;

Image2->Picture->Bitmap->Height=Image1->Height;

Image2->Width=Image1->Width;

Image2->Height=Image1->Height;

Image2->Canvas->Pen->Color=c5;

Image2->Canvas->FillRect(Image2->ClientRect);

if(actGridCheck->Checked)

{

for(int i=1;i<=Image2->Height;i++)

{

Image2->Canvas->MoveTo(int(zoom*i),0);

Image2->Canvas->LineTo(int(zoom*i),Image2->Height);

}

for(int i=1;i<=Image2->Width;i++)

{

Image2->Canvas->MoveTo(0,int(zoom*i));

Image2->Canvas->LineTo(Image2->Width,int(zoom*i));

}

}

} // Image2->Visible

}

void __fastcall TfrmLineSeg::actOpenFileExecute(TObject *Sender)

{

OpenDialog1->Title="Открыть изображение";

OpenDialog1->Filter="Файлы изображений (*.bmp)|*.bmp|Все файлы (*.*)|*.*";

if(OpenDialog1->Execute())

{

sb1->SimplePanel=true; sb1->SimpleText="Открытие файла ...";

Image1->Picture->LoadFromFile(OpenDialog1->FileName);

Image1->Width=Image1->Picture->Bitmap->Width;

Image1->Height=Image1->Picture->Bitmap->Height;

w=Image1->Picture->Width;

h=Image1->Picture->Height;

scb1->Enabled=true;

ZoomTo(zoom);

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]=apix[i][j][3]=-1;

}

sb1->SimpleText=""; sb1->SimplePanel=false;

}

}

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::actSaveFileExecute(TObject *Sender)

{

SaveDialog1->Filter="Файлы изображений (*.bmp)|*.bmp|Все файлы (*.*)|*.*";

SaveDialog1->DefaultExt="*.bmp";

SaveDialog1->Title="Сохранить изображение";

if(SaveDialog1->Execute())

{

Image1->Picture->SaveToFile(SaveDialog1->FileName);

}

}

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::Image2MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

if (actLockView->Checked) return;

int ix=int(X/zoom),iy=int(Y/zoom);

if(Button==mbLeft)

{

if(Image1->Canvas->Pixels[ix][iy]!=c0)

{

Image1->Canvas->MoveTo(ix,iy);

Image1->Canvas->Pixels[ix][iy]=c0;

apix[ix][iy][0]=1;

}

}

else if(Button==mbRight)

{

if(Image1->Canvas->Pixels[ix][iy]!=c1)

{

Image1->Canvas->MoveTo(ix,iy);

Image1->Canvas->Pixels[ix][iy]=c1;

apix[ix][iy][0]=0;

}

}

}

//---------------------------------------------------------------------------

void __fastcall TfrmLineSeg::Image2MouseMove(TObject *Sender,

TShiftState Shift, int X, int Y)

{

ShowInfo(X,Y);

if (actLockView->Checked) return;

int ix=int(X/zoom),iy=int(Y/zoom);

oldselline=selline;

oldselnode=selnode;

selline=apix[ix][iy][1];

selnode=apix[ix][iy][2];

TPoint p=NodeCentre(selnode);

if(Shift.Contains(ssLeft))

{

if(apix[ix][iy][0]!=1)

{

apix[ix][iy][0]=1;

Image1->Canvas->Pen->Color=c0;

Image1->Canvas->Pixels[ix][iy]=c0;

}

else

Image1->Canvas->MoveTo(ix,iy);

}

else if(Shift.Contains(ssRight))

{

if(apix[ix][iy][0]!=0)

{

apix[ix][iy][0]=0;

Image1->Canvas->Pen->Color=c1;

Image1->Canvas->Pixels[ix][iy]=c1;

}

else

Image1->Canvas->MoveTo(ix,iy);

}

if(actLineLightCheck->Checked && selline!=oldselline)

{

if(apix[ix][iy][1]>0) // есть линия

{

DrawGrid();

Image2->Canvas->Pen->Color=c2;

for(int i=0;i<w;i++) // выделяем линию

{

for(int j=0;j<h;j++)

{

if(apix[i][j][1]==selline) // линия

{

Image2->Canvas->MoveTo(int(zoom*i),int(zoom*j));

Image2->Canvas->LineTo(int(zoom*(i+1)),int(zoom*j));

Image2->Canvas->LineTo(int(zoom*(i+1)),int(zoom*(j+1)));

Image2->Canvas->LineTo(int(zoom*i),int(zoom*(j+1)));

Image2->Canvas->LineTo(int(zoom*i),int(zoom*j));

if(NeigCount(i,j)==1) // начало линии

{

Image2->Canvas->MoveTo(int(zoom*i),int(zoom*j));

Image2->Canvas->LineTo(int(zoom*(i+1)),int(zoom*(j+1)));

Image2->Canvas->MoveTo(int(zoom*(i+1)),int(zoom*j));

Image2->Canvas->LineTo(int(zoom*i),int(zoom*(j+1)));

}

if(apix[i][j][2]>0) // пересечение линии с узлом

{

Image2->Canvas->MoveTo(int(zoom*i),int(zoom*j));

Image2->Canvas->LineTo(int(zoom*(i+1)),int(zoom*(j+1)));

p=NodeCentre(apix[i][j][2]);

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));

Image2->Canvas->Pen->Color=c2;

}

}

} // for j

} // for i

}

} // actLineLightCheck->Checked

if(actSegLightCheck->Checked  && selnode!=oldselnode)

{

if(apix[ix][iy][2]>0)  // есть узел

{

DrawGrid();

Image2->Canvas->Pen->Color=c3;

for(int i=0;i<w;i++)  // выделяем узел

{

for(int j=0;j<h;j++)

{

if(apix[i][j][2]==selnode) // узел

{

Image2->Canvas->MoveTo(int(zoom*i),int(zoom*j));

Image2->Canvas->LineTo(int(zoom*(i+1)),int(zoom*j));

Image2->Canvas->LineTo(int(zoom*(i+1)),int(zoom*(j+1)));

Image2->Canvas->LineTo(int(zoom*i),int(zoom*(j+1)));

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.