Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_KG.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1.8 Mб
Скачать
  1. Волновой алгоритм закрашивания?

Волновой алгоритм закрашивания предназначен для расчета центра тяжести объектов по соответствующим изображениям. Идея была навеяна волновым алгоритмом поиска трассы на графе, известным в САПР электронных схем. Суть подобных алгоритмов состоит в том, что для начальной точки (вершины на графе) находятся соседние точки (другие вершины), которые отвечают двум условиям:

во-первых, эти вершины связаны с начальной; во-вторых, – эти вершины еще не отмечены, то есть они рассматриваются впервые. Соседние вершины текущей итерации отмечаются в массиве описания вершин, и каждая из них становится текущей точкой для поиска новых соседних вершин в следу итерации. Если в специальном массиве отмечать каждую вершину номером итерации, то когда будет достигнута конечная точка, можно совершить обратный цикл – от конечной точки к начальной по убыванию номеров итераций. В ходе обратного цикла и находятся все кратчайшие пути (если их несколько) между двумя заданными точками на графе. Подобный алгоритм можно также использовать, например, для поиска всех нужных файлов диске.

Относительно закрашивания растровых фигур, то здесь вершнами графа являются пикселы, а отметка пройденных пикселов делается прямо в растре цветом закрашивания. Как видим, это почти полностью повторяет идею предыдущего простейшего алгоритма, однако здесь мы не будем использовать рекурсию. Это обуславливает совсем другую последовательность обработки пикселов при закрашивании.

ВОЛНОВОЙ АЛГОРИТМ ЗАКРАШИВАНИЯ

numA=l;

stackA[0]. х = xst; //в массив stackA записываем

stackA[0]. у = yst; //координаты стартовой точки

numB=0; //массив stackB пока что пуст

Выполнить цикл

{

Если numA>0 то вызвать ОДИН_ШАГ(numA, numB, stackA, stackB) иначе выйти из цикла;

Если numB>0 то вызвать ОДИН_ШАГ(numB, numA, stackB, stackA) иначе выйти из цикла;

}

Определим функцию ОДИН_ШАГ(). Эта функция выполняет одну итерацию (фронт) распространения волны. При этом из массива Src[] читаются координаты пройденных точек, для каждой точки находится соседняя и записывается в массив Dest[], в котором формируется новый фронт

Фукнция ОДИН_ШАГ(numScr, numDest, Scr, Dest)

{

numDest = 0;

Выполнить цикл по i до numScr

{

x = Scr[i].x;

y = Scr[i].y;

БЛИЖНИЙ_ПИКСЕЛ(x+1, y, numDest, Dest);

БЛИЖНИЙ_ПИКСЕЛ(x-1, y, numDest, Dest);

БЛИЖНИЙ_ПИКСЕЛ(x, y+1, numDest, Dest);

БЛИЖНИЙ_ПИКСЕЛ(x, y-1, numDest, Dest);

}

}

Нам осталось определить функцию БЛИЖНИЙ_ПИКСЕЛ(). Эта функция может иметь вид:

БЛИЖНИЙ_ПИКСЕЛ(x, y, numStack, Stack)

{

Если ЦВЕТ_ПИКСЕЛ(x, y)<>0, то // закраска идет черным цветом (0)

{

ЗАКРАШИВАНИЕ(х, у, 0);

Stack[numStack].x=x;

Stack[numStack].y=y;

numStack= numStack+1;

}

}

Здесь цвет закрашивания и цвет контура – черный цвет (код 0). Пример работы алгоритма приведен на рис. 7.3.

Рис.8.3. Количество циклов для волнового алгоритма

От начальной точки распространяется волна пикселов закрашивания в виде ромба. В одном цикле ОДИН_ШАГ() закрашиваются пикселы вдоль линии периметра ромба (или нескольких ромбов в зависимости от сложности фигуры). В качестве рабочих массивов для текущего сохранения координат пикселов фронтов волн используются динамические массивы. Максимальная емкость массивов обуславливается размерами контура и рассчитывается эмпирически.

Необходимо заметить, что этот алгоритм не является самым быстрым из известных алгоритмов закрашивания, особенно если для его реализации в качестве функции закрашивания использовать медленную функцию SetPixel для рисования отдельных пикселов: в программах для Windows. Большую скорость закрашивания обеспечивают алгоритмы, которые обрабатывают не отдельные пикселы, а сразу большие блоки из многих пикселов, которые образовывают прямоугольники или линии.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]