PDA

View Full Version : سوال: این الگوریتم برسنهام برای رسم خطه



kamran_14
چهارشنبه 31 فروردین 1390, 12:57 عصر
سلام خسته نباشید
این الگوریتم برسنهام برای رسم خطه

x0:=300;
y0:=400;
x1:=1;
y1:=200;
dx := abs(x1-x0);
dy := abs(y1-y0) ;
if x0 < x1 then sx := 1 else sx := -1;
if y0 < y1 then sy := 1 else sy := -1;
err := dx-dy;
y:=1;
while (y=1) do begin
form1.canvas.moveto(x0,y0);
form1.canvas.lineto(x1,y1);
if (x0 = x1) and (y0 = y1) then exit;
e2 := 2*err;
if e2 > -dy then begin
err := err - dy;
x0 := x0 + sx;
end;
if e2 < dx then begin
err := err + dx;
y0 := y0 + sy ;
end;
end;
من خیلی علاقه دارم که این الگوریتم رو یاد بگیرم
من تو ضیحات این الگوریتم رو تا حدودی می دونم اما دوست دارم بیشتر بدونم
مثلا من نمی دونم در این الگوریتم متغییر err چه نقشی داره می شه لطفا کمکم کنید
مرسی:قلب:

kamran_14
چهارشنبه 31 فروردین 1390, 14:29 عصر
ببخشید
الگوریتم بالا اصلاح شده

x0:=5;
y0:=5;
x1:=5;
y1:=200;
dx := abs(x1-x0);
dy := abs(y1-y0) ;
form1.Canvas.Pen.Width:=2;
if x0 < x1 then sx := 1 else sx := -1;
if y0 < y1 then sy := 1 else sy := -1;
err := dx-dy;
y:=1;
while (y=1) do begin
form1.canvas.moveto(x0,y0);
form1.canvas.lineto(x0,y0);
if (x0 = x1) and (y0 = y1) then exit;
e2 := 2*err;
if e2 > -dy then begin
err := err - dy;
x0 := x0 + sx;
end;
if e2 < dx then begin
err := err + dx;
y0 := y0 + sy ;
end;
end;

mbshareat
چهارشنبه 31 فروردین 1390, 15:35 عصر
با سلام
الگوریتمی که آوردید رو امتحان کردم درست کار نکرد.


procedure line(x0,y0,x1,Y1:SmallInt);
Var
err,e2,sx,sy,dx,dy,Y:SmallInt;
Begin
x0:=5;
y0:=5;
x1:=5;
y1:=200;
dx := abs(x1-x0);
dy := abs(y1-y0) ;
form1.Canvas.Pen.Width:=2;
if x0 < x1 then sx := 1 else sx := -1;
if y0 < y1 then sy := 1 else sy := -1;
err := dx-dy;
y:=1;
while (y=1) do begin
form1.canvas.moveto(x0,y0);
form1.canvas.lineto(x0,y0);
if (x0 = x1) and (y0 = y1) then exit;
e2 := 2*err;
if e2 > -dy then begin
err := err - dy;
x0 := x0 + sx;
end;
if e2 < dx then begin
err := err + dx;
y0 := y0 + sy ;
end;
end;
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
Line(0,0,12,13);
end;

فکر کنم من جور دیگه روند ترسیم خط رو در کتاب آقای جعفر نژاد دیده بودم.در این الگوریتم از اصل جابجایی ضرب استفاده شده و برای پرهیز از تقسیم اعشاری از تقسیم صحیح و تست سر ریز استفاده شده. Sign از هرکدام از طول و عرض که کوچکتر است (و با هربار اضافه کردن سر ریز اتفاق نمی افتد) هم دائما به متغیری اضافه میشه و هر بار سر ریز تست میشه.DX و DY هم فاصله بدون علامت طول و عرض نقطه دوم با نقطه اوله.

kamran_14
پنج شنبه 01 اردیبهشت 1390, 20:03 عصر
الگوریتمی که آوردید رو امتحان کردم درست کار نکرد.
سلام
چرا می گید درست کار نکرد؟
شما این برنامه رو در یک تابع نوشتید
خب باید یه تغییراتی می دادید؟
مثلا مقادیری که من برای x0, y0, x1,y1 دادم را باید حذف می کردید
این الگوریتم درست کار می کنه من در پروژم ازش استفاده کردم

SAASTN
جمعه 02 اردیبهشت 1390, 00:25 صبح
این الگوریتم درست کار می کنه
درسته بدون مشکل کار میکنه و خط ترسیم شده هیچ اختلافی با خط ترسیم شده توسط Canvas نداره.
توی آدرس زیر یه فایل PDF مربوط به یه جزوه مختصر گرافیک کامپیوتریه. توی اون دقیقا در مورد مبنای عملکرد این الگوریتم صحبت شده. فقط چون نویسنده برای تفهیم تنها حالت خط با شیب مثبت و کمتر از یک رو در نظر گرفته پیاده سازی الگوریتم نهایی کمی متفاوت از چیزیه که شما اینجا آوردید.
http://dl.prozhe.com/server2/uploads/graphic-jozveh-[www.prozhe.com].zip
راستی یه دوتا مسئله یادم رفت بگم:
اول اینکه شما می تونید به جای MoveTo و LineTo از Canvas.Pixels استفاده کنید. دیگه نیازی هم به تغییر ضخامت قلم نبود.
نکته دیگه اینکه به تصور من بررسی الگوریتم ها به این سبک خیلی به این بخش مربوط نمیشه و شما می تونید سوالات مشابهتون رو در بخش ساختمان و الگوریتم مطرح کنید.