Метод цифрового дифференциального анализатора.


Заключается в решении дифференциального уравнения, описывающего процесс разложения отрезка в растр. Где x1, y1, x2, y2 — концы разлагаемого отрезка, а yi — начальное значение для очередного шага (вдоль отрезка). Т.е. получаем рекуррентное соотношение для последовательности значений y. В простом ЦДА — большее из приращений (?x или ?y) выбирается в качестве единицы растра. Алгоритм следующий:
аппроксимируем длину отрезка
if abs(x2 — x1) ? abs(y2 — y1) then
Длина = abs(x2 — x1)
else
Длина = abs(y2 — y1)
end if
полагаем большее из приращений ?x или ?y равным единице растра
? x = (x2 — x1)/Длина
? y = (y2 — y1)/Длина
округляем величины, а не отбрасываем дробную часть
использование знаковой функции делает алгоритм пригодным для всех квадрантов
x = x1 + 0.5?Sign(? x)
y = y1 + 0.5?Sign(? y)
начало основного цикла
I = 1
while (I ? Длина)
Plot (Integer(x), Integer(y))
x = x + ? x
y = y + ? y
I = I + 1
end while
finish

Примечание! Имеется предположение, что точки (x1,y1) и (x2,y2) — не совпадают. Здесь — функция Integer — функция преобразования вещественного числа в целое, путем округления, а не отбрасывания дробной части!!! Функция Sign — возвращает -1, 0, 1 для отрицательного, нулевого и положительного аргумента соответственно.

Загрузка...