|
ЖУК
помогите пожалуйста оптимизировать код так, чтобы он заработал
Graphics::TBitmap *FromImage =new Graphics::TBitmap();
Graphics::TBitmap *ToImage =new Graphics::TBitmap();
typedef enum {North, East, South, West} TDirectional;
int X,Y; // Координаты первой встречи с объектом
int cX,cY; // Текущие координаты маркера
Byte *Line, *ToLine; // Обрабатываемые полосы
Byte B; // Значение текущего пиксела
TDirectional Direct; // Направление движения жука
AnsiString st1;
FromImage->LoadFromFile("3.3.bmp");
Form1->Image1->Picture->Bitmap=FromImage;
for (Y = 0; Y <FromImage->Height; Y++) // Идем до тех пор, пока не встретим черную область
{
Line = (Byte*)FromImage->ScanLine[Y];
for (X = 0; X<FromImage->Width; X++)
{
B = Line[X];
// st1=IntToStr(B); ShowMessage(st1);
//if (B < 255) break; // Если встречен объект, отличающийся от цвета фона (255 - белый)
}
if (X != FromImage->Width) break; // прервать поиск
}
if ((X == FromImage->Width) && (Y == FromImage->Height)) return; // Если не нашли ни одного темного пиксела, то выходим из процедуры
ToLine = (Byte*)ToImage->ScanLine[Y]; // Если все нормально, начинаем обход по методу жука
ToLine[X] = 0;
//Поворачиваем налево (новое направление - север)
cX = X;
cY = Y - 1;
Direct = North;
Line = (Byte*)FromImage->ScanLine[cY];
while ((cX != X) || (cY != Y)) // Пока не придем в начальную точку, выделяем контур объекта
{
switch (Direct) // В зависимости от текущего направления движения жука
{
case North: // Север
{
B = Line[cX];
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];
}
}
}
}
|