русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Алгоритм Брезенхема для генерации окружности


Дата добавления: 2013-12-23; просмотров: 4631; Нарушение авторских прав


 

В растр нужно разлагать не только линейные, но и другие, более сложные функции.

 
 

Для того чтобы нарисовать окружность необходимо сгенерировать только 1/8 часть. Остальные ее части могут быть получены последовательными отражениями. Если сгенерирован первый октант (от 0 до 45° против часовой стрелки), то второй октант можно получить зеркальным отражением относительно прямой y=x, что дает в совокупности первый квадрант. Первый квадрант отражается относительно прямой x=0 для получения соответствующей части окружности во втором квадранте. Верхняя полуокружность отражается относительно прямой y=0 для завершения построения полной окружности (рис.4).

Рис.4. Генерация окружности

 



 
 

Для вывода алгоритма рассмотрим первую четверть окружности с центром в начале координат (рис.5). Заметим, что если работа алгоритма начинается в точке x=0, y=R, то при генерации окружности по часовой стрелке в первом квадранте y является монотонно убывающей функцией аргумента x. Аналогично, если исходной точкой является точка x=R, y=0, то при генерации окружности против часовой стрелки x будет монотонно убывающей функцией аргумента y.

Предположим, что центр окружности и начальная точка находятся точно в точках растра, выберем для нашего случая генерацию по часовой стрелке с началом в точке x=0, y=R.

 
 

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

,

,

.

 



Разность между квадратами расстояний от центра окружности до диагонального пикселя () и от центра до точки на окружности R2 равна

.

Как и в алгоритме Брезенхема для отрезка, для выбора соответствующего пикселя желательно использовать только знак ошибки, а не ее величину.

При <0 диагональная точка () находится внутри реальной окружности, в этой ситуации следует выбрать либо пиксель (), т.е. , либо пиксель (), т.е. . Далее проверяется разность квадратов расстояний от окружности до пикселов в горизонтальном и диагональном направлениях:

.

 



При d<0 расстояние от окружности до диагонального пикселя () больше, чем до горизонтального пикселя (). Напротив, если d>0, расстояние до горизонтального пикселя () больше. Таким образом:

- при d£0 выбираем в точке (),

- при d>0 выбираем в точке (),

- при d=0, когда расстояние от окружности до обоих пикселов одинаково, выбираем горизонтальный шаг.

Если >0, то диагональная точка () находится вне окружности. В данной ситуации ясно, что должен быть выбран либо пиксель (), т.е. , либо (), т.е. . Далее проверяется разность между квадратом расстояний от окружности до диагонального пикселя и вертикального пикселов, т.е.

 



.

 



При <0 расстояние от окружности до вертикального пикселя () больше и следует выбирать диагональный шаг к пикселю (). Напротив, в случае >0 расстояние от окружности до диагонального пикселя больше и следует выбрать вертикальное движение к пикселю (). Таким образом:

- при £0 выбираем в (),

- при >0 выбираем (),

- здесь в случае =0, т.е. когда расстояния равны, выбран диагональный шаг.

 



Подведем итог полученных результатов:

<0

d£0 выбираем пиксель () à ,

d>0 выбираем пиксель () à ,

>0

£0 выбираем пиксель () à ,

>0 выбираем пиксель () à ,

=0 выбираем пиксель () à ,

 



Легко разработать простые рекуррентные соотношения для реализации пошагового алгоритма. Сначала рассмотрим горизонтальный шаг к пикселю (). Обозначим это новое положение пикселов (i+1). Тогда координаты нового пикселя и значение равны:

,

,

Аналогично координаты нового пикселя и значение для шага к пикселю () таковы:

,

,

.

 



То же самое для шага к пикселю () :

,

,

.

 



 



Выполняя частные алгебраические преобразования и используя метод Брезенхема, получим следующий алгоритм:

 



Procedure Mich_Circle (radius; color: integer);

Var

x,y,d: integer;

Begin

x:=0;

y:=radius;

d:=3-2*radius

While x<y do

begin

CirclePoint (x,y,color);

if d<0 then d:=d+4*x+6

else

begin

d:=d+4*(x-y)+10;

y:=y-1

end;

x:=x+1

end;

if x=y then CirclePoint (x,y,color)

End.

 



Процедура CirclePoint имеет вид:

 



Procedure CirclePoint (x,y,color: integer);

Begin

PutPixel (x,y,color);

PutPixel (y,x,color);

PutPixel (y,-x, color);

PutPixel (-x,-y, color);

PutPixel (x,-y, color);

PutPixel (-y,-x, color);

PutPixel (-y,x, color);

PutPixel (-x,y, color)

End.

 



 





<== предыдущая лекция | следующая лекция ==>
Общий алгоритм Брезенхема | Групповое кодирование


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.007 сек.