2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Алгоритм Брезенхема
Сообщение29.05.2015, 13:38 
Написал процедуру, отрезок отлично рисуется в 1 октанте, в 8 октанте не хочет. В чем может быть дело? Перепробовал все. Помогите пожалуйста.
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
procedure brezenhem(x1,y1,x2,y2:integer);
var dx,dy,i,y:integer; e0:double;
begin
 
dx:=x2-x1;
dy:=y2-y1;
e0:=2*dy-dx;
y:=y1;
 
//1 октант
if (dx>dy) and (y2>y1) and (x2>x1) then
for i:=x1 to x2 do begin
form1.paintbox1.canvas.Pixels[i,y]:=clblack;
e0:=e0+2*dy;//приращение ошибки при единичном шаге по горизонтальной оси
  if e0>=0 then begin
   inc(y);
   e0:=e0-2*dx;//коррекция ошибки при шаге по вертикальной оси
  end;
end;
  //8 октант
if  (dx>abs(dy)) and (y2<y1) and (x2>x1) then
 
for i:=x1 to x2 do begin
form1.paintbox1.canvas.Pixels[i,y]:=clblack;
e0:=e0+2*dy;
  if e0>=0 then begin
   dec(y);
   e0:=e0-2*dx;
  end;
end;
 
 end;              

 
 
 
 Re: Алгоритм Брезенхема
Сообщение01.06.2015, 10:46 
Еще актуально?
У вас в случае 8 октанта y2 меньше y1, следовательно e0 всегда получается отрицательным. Условие e0>=0 никогда не выполняется, всегда рисуется прямая линия. Вы немного неаккуратно перенесли основную идею алгоритма в код.

 
 
 
 Re: Алгоритм Брезенхема
Сообщение02.06.2015, 09:29 
rockclimber
Я уже нашел ошибку, надо abs делать для dx и dy) в самом начале:
Используется синтаксис Pascal
dx:=abs(x2-x1);
dy:=abs(y2-y1);
e0:=2*dy-dx;
y:=y1;
x:=x1;
...  

Но все равно спасибо!

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group