Пункт «Заблокировать вид» позволяет зафиксировать выделенные элементы изображения, не изменяя подсветку при перемещении курсора мыши в области изображения.
Меню «Вид»
Рис. П.2.7
Пример подсветки узла приведен на рис. П.2.8
Подсветка узла
Рис. П.2.8
Пример подсветки сегмента приведен на рис. П.2.9
Подсветка сегмента
Рис. П.2.9
В результате окончательной обработки изображения в области «Результат обработки» будут выведены коды, предназначенные для последующей передачи в подсистему цепного кодирования (рис. П.2.10). Данные результаты могут быть сохранены в файл. Для этого следует использовать пункт «Сохранить код» в меню «Файл».
Результат кодирования сегментов
Рис. П.2.10
После работы с изображением исходный массив точек может быть сохранен в файл, для этого следует воспользоваться пунктами «Сохранить массив» или «Сохранить файл» в меню «Файл» для сохранения в файл массива точек или в файл формата BMP соответственно. При выборе этих пунктов будет вызван стандартный диалог для сохранения файла, где следует указать имя сохраняемого файла и нажать кнопку «Сохранить».
После работы с программой для корректного ее завершения следует использовать пункт «Выход» в меню «Файл» (рис. П.2.11) или использовать стандартную пиктограмму закрытия окна. При этом будет выдан запрос на подтверждение выхода из программы (рис. П.2.12). Во избежание потери данных при выходе из программы следует убедиться, что все необходимые данные сохранены.
Выход из программы
Рис. П.2.11
Запрос на подтверждение выхода
Рис. П.2.12
П.2.5. Сообщения оператору
Сообщения, выдаваемые при работе с программой и действия, которые необходимо выполнить при их получении, приведены в таблице П.2.1.
Таблица П.2.1
Сообщения, выдаваемые при работе программы и необходимые действия при их получении
Сообщение | Описание | Действия |
1 | 2 | 3 |
Размер нового изображения | Программа предлагает выбрать размер вновь создаваемого изображения в точках | Ввести значение ширины и высоты изображения |
Неверно указано число | Введенное число не соответствует заданному формату | Ввести корректное число |
Выход ? | Запрос на подтверждение выхода из программы. Не сохраненные данные могут быть утеряны | Подтвердить или опровергнуть запрос на выход |
Невозможно открыть файл | Произошла ошибка при попытке открыть указанный файл | Проверить наличие файла и доступа к нему |
Невозможно сохранить файл | Произошла ошибка при попытке сохранить указанный файл | Проверить наличие доступа к указанному пути. |
Файл уже существует. Перезаписать ? | Файл с именем, указанным для сохранения, уже существует | Подтвердить запрос на перезапись или выбрать другое имя файла |
Настройка | Вызван диалог настройки программы | Выполнить необходимые действия по настройке, затем нажать кнопку «ОК» для сохранения изменений или кнопку «Отмена» для их отмены |
Не выполнен поиск узлов | При пошаговой обработке была вызвана процедура поиска сегментов прежде чем был выполнен поиск узлов | Сначала необходимо выполнить поиск узлов, а затем выполнять поиск сегментов |
Не выполнен поиск сегментов | При пошаговой обработке была вызвана процедура кодирования сегментов прежде чем был выполнен поиск сегментов | Сначала необходимо выполнить поиск сегментов, а затем выполнять их кодирование |
П.3.1. Текст модуля lineseg.h
//---------------------------------------------------------------------------
#ifndef LineSegH
#define LineSegH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ActnList.hpp>
#include <Menus.hpp>
#include <Dialogs.hpp>
#include <Graphics.hpp>
#include <ExtCtrls.hpp>
#include <ComCtrls.hpp>
#include <ToolWin.hpp>
#include <ImgList.hpp>
#include <CustomizeDlg.hpp>
//---------------------------------------------------------------------------
class TfrmLineSeg : public TForm
{
__published: // IDE-managed Components
TStatusBar *sb1;
TPanel *Panel1;
TScrollBox *scb1;
TImage *Image1;
TImage *Image2;
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *N3;
TMenuItem *N5;
TMenuItem *N4;
TMenuItem *N2;
TMenuItem *N6;
TMenuItem *N10;
TMenuItem *N11;
TMenuItem *N12;
TMenuItem *N1001;
TMenuItem *N10x1;
TMenuItem *N9;
TActionList *ActionList1;
TAction *actExit;
TAction *actOpenFile;
TAction *actSaveFile;
TAction *actNewFile;
TAction *actZoomIn;
TAction *actZoomOut;
TAction *actZoom1;
TAction *actZoom10;
TAction *actAnalyze;
TAction *actGridCheck;
TAction *actLightCheck;
TOpenDialog *OpenDialog1;
TSaveDialog *SaveDialog1;
TImageList *ImageList1;
TCoolBar *CoolBar1;
TToolBar *ToolBar1;
TToolBar *ToolBar2;
TToolBar *ToolBar3;
TToolButton *ToolButton1;
TToolButton *ToolButton2;
TToolButton *ToolButton3;
TToolButton *ToolButton4;
TToolButton *ToolButton5;
TToolButton *ToolButton6;
TToolButton *ToolButton7;
TToolButton *ToolButton8;
TToolButton *ToolButton13;
TToolButton *ToolButton14;
TAction *actLineLightCheck;
TToolButton *ToolButton11;
TToolButton *ToolButton10;
TAction *actSegLightCheck;
TSplitter *Splitter1;
TPanel *Panel2;
TMemo *MemoLog;
TMemo *MemoOut;
TSplitter *Splitter2;
TToolButton *ToolButton12;
TAction *actLockView;
TToolButton *ToolButton16;
TMenuItem *N8;
TMenuItem *N16;
TMenuItem *N17;
TMenuItem *N18;
TToolButton *ToolButton17;
TAction *actAnalyzeNode;
TAction *actAnalyzeSeg;
TToolButton *ToolButton9;
TAction *actMatchLines;
TToolButton *ToolButton18;
TToolButton *ToolButton20;
TAction *actZoomWnd;
TMenuItem *N19;
TToolButton *ToolButton21;
TAction *actMatchOut;
TMenuItem *N7;
TMenuItem *N22;
TAction *actOpenArray;
TAction *actSaveArray;
TMenuItem *N23;
TMenuItem *N24;
TToolButton *ToolButton22;
TToolButton *ToolButton23;
TMemo *mArray;
TAction *actOptions;
TMenuItem *N13;
TToolButton *ToolButton15;
TToolButton *ToolButton19;
TLabel *Label1;
TLabel *Label2;
TToolButton *ToolButton24;
TMenuItem *N14;
TAction *actSaveCode;
TMenuItem *N20;
TToolButton *ToolButton25;
TToolButton *ToolButton26;
TToolButton *ToolButton27;
TAction *actSegCodeOut;
TMenuItem *N15;
void __fastcall actExitExecute(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall actZoomInExecute(TObject *Sender);
void __fastcall actZoomOutExecute(TObject *Sender);
void __fastcall actOpenFileExecute(TObject *Sender);
void __fastcall actSaveFileExecute(TObject *Sender);
void __fastcall Image2MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall Image2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall actZoom1Execute(TObject *Sender);
void __fastcall actAnalyzeExecute(TObject *Sender);
void __fastcall FormCanResize(TObject *Sender, int &NewWidth,
int &NewHeight, bool &Resize);
void __fastcall actNewFileExecute(TObject *Sender);
void __fastcall actGridCheckExecute(TObject *Sender);
void __fastcall actLightCheckExecute(TObject *Sender);
void __fastcall actZoom10Execute(TObject *Sender);
void __fastcall actLineLightCheckExecute(TObject *Sender);
void __fastcall actSegLightCheckExecute(TObject *Sender);
void __fastcall actLockViewExecute(TObject *Sender);
void __fastcall actAnalyzeNodeExecute(TObject *Sender);
void __fastcall actAnalyzeSegExecute(TObject *Sender);
void __fastcall actMatchLinesExecute(TObject *Sender);
void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
void __fastcall actZoomWndExecute(TObject *Sender);
void __fastcall actMatchOutExecute(TObject *Sender);
void __fastcall actOpenArrayExecute(TObject *Sender);
void __fastcall actSaveArrayExecute(TObject *Sender);
void __fastcall actOptionsExecute(TObject *Sender);
void __fastcall actSaveCodeExecute(TObject *Sender);
void __fastcall actSegCodeOutExecute(TObject *Sender);
private: // User declarations
void ZoomTo(double z);
void DrawGrid();
void ShowInfo(int X, int Y);
int __fastcall NeigCount(int x, int y);
int VectMove(int &x, int &y, int vect);
void wlog(AnsiString s);
AnsiString VectToStr(int v);
void ValidateView();
double plDistance(double x,double y,double x1,double y1,double x2,double y2);
// plDistance вычисляет расстояние (минимальное) от точки (x,y)
// до прямой, заданной точками (x1,y1) и (x2,y2)
AnsiString StrToLen(AnsiString str, int len);
// StrToLen возвражает строку длины len
// заполняя пробелями недостающие символы в начале строки str
void __fastcall NeigNode(int x, int y, int n);
// NeigSeg обрабатывает соседей точки (x,y)
// на принадлежность узлу n
// является рекурсивной
void __fastcall NeigLine(int x,int y, int n);
// NeigLine обрабатывает соседей точки (x,y)
// на продолжение линии n
// является рекурсивной
void __fastcall GetLineVect(int x,int y, int n);
// GetLineVect обрабатывает линию в код
// рекурсивная
TPointNodeCentre(intn);
// 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)