// на продолжение линии 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;
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;
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;
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->Pixels[ix][iy]=c1;
apix[ix][iy][0]=0;
void __fastcall TfrmLineSeg::Image2MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
ShowInfo(X,Y);
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)
Image1->Canvas->Pen->Color=c0;
else
else if(Shift.Contains(ssRight))
if(apix[ix][iy][0]!=0)
Image1->Canvas->Pen->Color=c1;
if(actLineLightCheck->Checked && selline!=oldselline)
if(apix[ix][iy][1]>0) // есть линия
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+1)),int(zoom*j));
if(apix[i][j][2]>0) // пересечение линии с узлом
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));
} // for j
} // for i
} // actLineLightCheck->Checked
if(actSegLightCheck->Checked && selnode!=oldselnode)
if(apix[ix][iy][2]>0) // есть узел
Image2->Canvas->Pen->Color=c3;
for(int i=0;i<w;i++) // выделяем узел
if(apix[i][j][2]==selnode) // узел
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18