Регистрация    Вход    Форум    Поиск    FAQ

  •  Новости
  • Beeline + Twitter = чирикай через SMS!

    Beeline + Twitter = чирикай через SMS! На первой картинке обозначены команды, при помощи которых через SMS Вы сможете кого-либо зафолловить или же отписаться, ретвитнуть чей-либо пост или же написать личное сообщение.

    Open Graph Protocol. От создателей Facebook

    Open Graph Protocol. От создателей Facebook Разбираясь с Facebook API, случайно наткнулся на другую интересную разработку от этих людей.

    Глобальное ускорение Wordpress

    Глобальное ускорение Wordpress Не считая очевидных решений типа отключения некоторых плагинов и перехода на тему попроще, я вижу 2 пути для оптимизации: кэширование и сжатие траффика.




  •  Часы


  •  Поиск

Optimaze » Программирование » Алгоритм Брезенхема




Алгоритм Брезенхема

  1. Итак, для таких-же чайников как я, код по шагам:


Не то чтобы я любил програмно рисовать компьютерную графику. Точнее, несмотря на интерес, разбираться в куче координат и вспомогательных параметров бывает сложно. Взять хотя-бы основы – постоение прямой линии, по алгоритму Брезенхема. Надо сказать, курил тему несколько часов.

 

Задача – построить шестнадцать одинаковых линий, которые пересекаются в одной точке, с одинаковыми углами между ближайшими отрезками. Если проще, то что-то типа шестнадцатиугольной звезды, ограниченной квадратом. Реализация – в среде Dephi. Была дана куча формул, которые позволяли рисовать линию в каждом октанте. Впрочем, решив не изобретать велосипед, я принял решение взять с википедии оптимизированный вариант функции. Благо там код на Object Pascal, который суть почти Delphi. Но разобраться в коде все равно надо было..

 

Итак, для таких-же чайников как я, код по шагам:

Функция вызывается с 4 параметрами, координаты начала и конца. dx и dy – это модуль отрезка по x и y соответственно. sx и sy это шаги, на которые координата убывает/прирастает (зависит от квадранта). Ну и наконец swapped – флаг, который обращается в 1, когда модуль по x больше модуля по y, а p – вспомогательный параметр.

 

procedure Draw_line(x0,y0,x1,y1:Integer);

    var dx,dy,i,sx,sy,swapped,p,x,y:integer;

    begin

        dx:=abs(x0-x1);

        dy:=abs(y0-y1);

        sx:=Sign(x1-x0);

        sy:=Sign(y1-y0);

        Form1.Label3.Caption:=IntToStr(sx);

        Form1.Label4.Caption:=IntToStr(sy);

        x:=x0;

        y:=y0;

        swapped:=0;

        end;

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

 

        p:= 2*dy - dx;

        for i:=0 to dx do begin

            Form1.Canvas.Pixels[x,y]:=clBlack;

            if p>=0 then begin

                if swapped=1 then x:=x+sx else y:=y+sy;

                p:=p-2*dx;

            end;

            if swapped=1 then y:=y+sy else x:=x+sx;

            p:=p+2*dy;

        end;

end;

Собственно, это и есть полный код функции.Чтобы построить звезду, осталось вызвать ее с нужными координатами:

 

//Center set in 200,200

Cx:=200;

Cy:=200;

Draw_line(Cx,Cy,300,300);

Draw_line(Cx,Cy,100,300);

Draw_line(Cx,Cy,200,300);

Draw_line(Cx,Cy,100,200);

Draw_line(Cx,Cy,100,100);

Draw_line(Cx,Cy,200,100);

Draw_line(Cx,Cy,300,100);

Draw_line(Cx,Cy,300,200);

 

//Draw 8 rest

Draw_line(Cx,Cy,150,100);

Draw_line(Cx,Cy,250,100);

Draw_line(Cx,Cy,250,300);

Draw_line(Cx,Cy,150,300);

 

Draw_line(Cx,Cy,100,150);

Draw_line(Cx,Cy,300,150);

Draw_line(Cx,Cy,300,250);

Draw_line(Cx,Cy,100,250);

Надеюсь, что эта статья поможет полным чайникам в области комп. графики.



Рейтинг: 4.6/5, основан на 25 голосах.


Нравится



Вернутся назад


   

Вам будет интересно:

Hibernate 3. 1. 3 out

Эта версия, в основном, содержит исправления ранее найденных ошибок, самой неприятной из которых, по моему мнению, является отсутствие отложенной инициализации many-to-one ассоциации в ветке 3.1.

Потребитель сервиса (Service consumer)

Экземпляр класса ChannelFactory - это объект, который создает прокси нашего сервиса.

Верстка DIVaми в DreamWeaver

Когда мы расматривали верстку таблицами, мы резали макет на картинки, для дивной верстки надо тоже порезаные картинки.

Первое сравнение производительности Tiger (Java SE 5) и Mustang (Java SE 6)

Результаты своего сравнительного тестирования производительности текущей и следующей версии Java - Tiger (Java SE 5) и Mustang (Java SE 6) соответственно.



  •  Публикации


8 методов раскрутки своего форума с нуля

8 методов раскрутки своего форума с нуля Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.

Как привлекать посетителей на проект

Как привлекать посетителей на проект Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.

Про MySQL, серверы и PayPal

Про MySQL, серверы и PayPal Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...

Реклама в Твиттере. Как подать свой продукт

Реклама в Твиттере. Как подать свой продукт Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...

Пока блог на локалхосте

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

Авторитет блоггера притягивает

Авторитет блоггера притягивает Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.