Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.02.2011, 23:44
Новичок

Отправить личное сообщение для Yooho Посмотреть профиль Найти все сообщения от Yooho
 
Регистрация: 24.02.2011
Сообщений: 2

ЖУК
помогите пожалуйста оптимизировать код так, чтобы он заработал


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];
}
}

}
}
  #2  
Старый 24.02.2011, 23:52
Новичок

Отправить личное сообщение для Yooho Посмотреть профиль Найти все сообщения от Yooho
 
Регистрация: 24.02.2011
Сообщений: 2

ну что, будем оптимизировать код или как?
  #3  
Старый 25.02.2011, 00:08
гocть

 
Сообщений: n/a

не, не будем
  #4  
Старый 07.03.2011, 01:59
Аватар для Vertex
Новичок

Отправить личное сообщение для Vertex Посмотреть профиль Найти все сообщения от Vertex
 
Регистрация: 22.06.2008
Адрес: Узбекистан, Ташкент
Сообщений: 22

Разработал к собственному проекту
Совсем недавно я искал алгоритмы построения контуров. Искал неудачно и потому разработал свой. Алгоритм относительно прост:

Жук имеет пять усиков, направленных на Запад, Северо-Запад, Север, Северо-Восток и Восток относительно ориентации направления движения жука. Тем самым, имеется всего 5 битов статуса, по которым следует принимать решение по смене направления.
Так-как жук на зазубринах будет так или иначе попадать в тупики, то необходимо запоминать предыдущий статус.
Вся логика рефлексов жука хранится в одном массиве.

Ниже представлен полный листинг на языке Си.
В кейсе WM_CREATE создаётся BitMap 640x480x32bpp с Альфа-каналом. Жук ориентируется по данным Альфа-канала. По-этому изображение переносится в него.
Интерфейс программы довольно примитивен. Справа-вверху выводится Zoom окружающего жука пространства. Справа-внизу выводится текущее состояние усиков жука в виде Check-Box'ов, причём их серостью отображается их предыдущее состояние. А в центре выводятся Hex-коды текущего и предыдущего состояние.

Программа реагирует только на три клавиши:
Esc - двигает жука в цикле до полного замыкания контура. Если изменить геометрию фигуры, нажатие клавиши может привести к зацикливанию и ошибке.
Пробел - делает всего один шаг. Необходим при отладке таблицы рефлексов для поиска причин проскоков или зацикливания.
Enter - как и Пробел служит отладке, но делает не один, а серию шагов.
Вложения:
Тип файла: zip SideBar.zip (19.4 Кб, 208 просмотров)
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра