Смекни!
smekni.com

Алгоритмы выделения контуров (стр. 2 из 2)

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

{

}

}

}

}

}