if (B < 255)
{
ToLine = (Byte*)ToImage->ScanLine[cY];
ToLine[cX] = 0;
Direct = West;
cX--;
}
// Иначе поворачиваем "направо"
else
{
Direct = East;
cX++;
}
}
break;
// Восток
case East:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
ToLine = (Byte*)ToImage->ScanLine[cY];
ToLine[cX] = 0;
Direct = North;
cY--;
Line = (Byte*)FromImage->ScanLine[cY];
}
// Иначе поворачиваем "направо"
else
{
Direct = South;
cY++;
Line = (Byte*)FromImage->ScanLine[cY];
}
}
break;
// Юг
case South:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
ToLine = (Byte*)ToImage->ScanLine[cY];
ToLine[cX] = 0;
Direct = East;
cX++;
}
// Иначе поворачиваем "направо"
else
{
Direct = West;
cX--;
}
}
break;
// Запад
case West:
{
B = Line[cX];
// Если элемент "черный", поворачиваем снова "налево"
if (B < 255)
{
ToLine = (Byte*)ToImage->ScanLine[cY];
ToLine[cX] = 0;
Direct = South;
cY++;
Line = (Byte*)FromImage->ScanLine[cY];
}
// Иначе поворачиваем "направо"
else
{
Direct = North;
cY--;
Line = (Byte*)FromImage->ScanLine[cY];
}
}
}
}
}
// ---------------------------------------------------------------------------
void AlgorithmScan(Graphics::TBitmap* FromImage,
Graphics::TBitmap* ToImage)
{
// Тип ветви (левая или правая)
typedef enum {bLeft, bRight} TBranchType;
// Структура, описывающая ветвь
struct TBranch
{
TBranchType BranchType; // Тип ветви
TBranch* Branch; // Парная ветвь
};
// Структура, описывающая строку
struct TString
{
int BeginX; // Начало черной серии
int EndX; // Конец черной серии
TBranch* Branch; // Указатель на структуру ветви
};
// Возможные ситуации
typedef enum {
sBegin, // Начало
sNext, // Продолжение
sBranch, // Ветвление
sFusion, // Слияние
sEnd // Конец
} TSituation;
// Сканируемая полоса
struct TLine
{
Byte* L1; // Верхняя линия
Byte* L2; // Нижняя линия
};
int Y; // Текущая координата Y
int X; // Текущая координата X
int cX; // Временная координата X для сканирования
TLine Line; // Сканируемая полоса
TSituation CurrentSituation; // Текущая ситуация
for (Y = 0; Y < FromImage->Height; Y++)
{
Line.L1 = (Byte*)FromImage->ScanLine[Y];
Y++;
Line.L2 = (Byte*)FromImage->ScanLine[Y];
// Пробуем выявить ситуации:
// Ищем первый черный элемент во второй линии сканируемой полосы
for (X = 0; X < FromImage->Width; X++)
{
if (Line.L2[X] < 255)
{
// Если черный элемент найден, пытаемся уточнить ситуацию
CurrentSituation = sBegin;
for (cX = X; cX < FromImage->Width; cX++)
{
}
}
}
}
}