Цифровой дифференциальный анализатор
Один из методов разложения отрезка в растр состоит в решении дифференциального уравнения, описывающего этот процесс. Для прямой линии имеем: или Решение представляется в виде
где x1, y1 и x2 , y2 – концы разлагаемого отрезка и yi – начальное значение для очередного шага вдоль отрезка. Фактически уравнение (1.) представляет собой рекуррентное соотношение для последовательных значений y вдоль нужного отрезка. Этот метод, используемый для разложения в растр отрезков, называется цифровым дифференциальным анализатором (ЦДА). В простом ЦДА либо , либо (большее из приращений) выбирается в качестве единицы растра. Ниже приводится простой алгоритм, работающий во всех квадрантах:
Процедура разложения в растр отрезка по методу цифрового дифференциального анализатора (ЦДА) предполагается, что концы отрезка (x1,y1) и (x2,y2) не совпадают Integer – функция преобразования вещественного числа в целое. Примечание: во многих реализациях функция Integer означает взятие целой части, т.е. Integer (- 8.5) = - 9, а не - 8. В алгоритме используется именно такая функция. Sign - функция, возвращающая - 1, 0, 1 для отрицательного нулевого и положительного аргумента соответственно. if abs (x2 -x1 ) ³ abs (y2 - y1 ) then Длина = abs (x2 - x1 ) else Длина = abs (y2 - y1 ) end if полагаем большее из приращений Dx или Dy равным единице растра Dx = (x2 -x1 ) / Длина Dy = (y2 - y1 ) / Длина округляем величины, а не отбрасываем дробную часть использование знаковой функции делает алгоритм пригодным для всех квадрантов x = x1 + 0.5 * Sign (Dx) y = y1 + 0.5 * Sign (Dy) начало основного цикла i =1 while (i £ Длина) Plot (Integer (x), Integer (y)) x = x + Dx y = y + Dy i = i + 1 end while finish С помощью этого алгоритма получают прямые, вполне удовлетворительного вида, но у него есть ряд недостатков. Во-первых, плохая точность в концевых точках. Во-вторых, результаты работы алгоритма зависят от ориентации отрезка. Вдобавок предложенный алгоритм использует вещественную арифметику, что заметно снижает скорость выполнения.
|