|
||||||||||||||||||||||||
Случай Dd > 0. Случай Dd = 0 ⇐ ПредыдущаяСтр 2 из 2 Случай Dd > 0 Здесь в качестве следующего пиксела могут быть выбраны или диагональный - Pd или вертикальный Pv. Для определения того, какую пиксел выбрать Pd или Pv составим разность:
Если si £ 0, то расстояние до вертикальной точки больше и надо выбирать диагональный пиксел Pd, если же si > 0, то выбираем вертикальный пиксел Pv. Рассмотрим вычисление si для разных вариантов. Для вариантов 5 и 6: Dd > 0 и Dv £ 0, так как диагональный пиксел вне, а вертикальный либо вне либо на окружности.
Добавив и вычтя (X+1)2 получим:
В квадратных скобках стоит Dd, так что
Для варианта 7: Ясно, что должен быть выбран вертикальный пиксел Pv. Проверка компонент si показывает, что Dd > 0 и Dv > 0, причем si > 0, так как диагональная точка больше удалена от окружности, т.е. по критерию si > 0 как и в предыдущих случаях следует выбрать вертикальный пиксел Pv, что соответствует выбору для вариантов 5 и 6. Случай Dd = 0 Для компонент di имеем: Dg > 0 и Dd = 0, следовательно по критерию di > 0 выбираем диагональный пиксел. С другой стороны, для компонент si имеем: Dd = 0 и Dv < 0, так что по критерию si £ 0 также выбираем диагональный пиксел. Итак: Dd < 0 di £ 0 - выбор горизонтального пиксела Pg di > 0 - выбор диагонального пиксела Pd Dd > 0 si £ 0 - выбор диагонального пиксела Pd si > 0 - выбор вертикального пиксела Pv Dd = 0 выбор диагонального пиксела Pd. Выведем рекуррентные соотношения для вычисления Dd для (i+1)-го шага, после выполнения i-го. 1. Для горизонтального шага к Xi+1, Yi Xi+1 = Xi + 1 2. Для диагонального шага к Xi+1, Yi-1 Xi+1 = Xi + 1 3. Для вертикального шага к Xi, Yi-1 Xi+1 = Xi В Приложении 5 приведена подпрограмма V_circle, реализующая описанный выше алгоритм и строящая дугу окружности в первой четверти. Начальная инициализация должна быть: X= 0 Y= R Dd = (X+1)2 + (Y-1)2 - R2 = 1 + (R-1)2 - R2 = 2*(1 - R) Пикселы в остальных четвертях можно получить отражением. Кроме того достаточно сформировать дугу только во втором октанте, а остальные пикселы сформировать из соображений симметрии, например, с помощью подпрограммы Pixel_circle, приведенной в Приложении и заносящей симметричные пикселы по часовой стрелке от исходного.
|
||||||||||||||||||||||||
|