Алгоритм БрезенхемаНе то чтобы я любил програмно рисовать компьютерную графику. Точнее, несмотря на интерес, разбираться в куче координат и вспомогательных параметров бывает сложно. Взять хотя-бы основы – постоение прямой линии, по алгоритму Брезенхема. Надо сказать, курил тему несколько часов.
Задача – построить шестнадцать одинаковых линий, которые пересекаются в одной точке, с одинаковыми углами между ближайшими отрезками. Если проще, то что-то типа шестнадцатиугольной звезды, ограниченной квадратом. Реализация – в среде 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); Надеюсь, что эта статья поможет полным чайникам в области комп. графики. Вернутся Вам будет интересно:
|
- Публикации
Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.
Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.
Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...
Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...
Самое время кратко описать, чем нам придется заниматься. Прежде всего нужно понять, что блог ты будешь делать для получения ...
Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.