Bresenham ve Xiaolin Wu

Kodlamaya meraklı olanlar zaten bilirler, lakin ben sıkça unutuyorum iki nokta arasına doğru bir çizgi çekmenin yöntemini.

Bresenham bu işi en hızlı yapan en eski adam, Xiaolin Wu ise bresenham’ın algoritmasını geliştirip antialias ekleyen adam.

Ben genellikle oyun yazımı sırasında sprite’ın düz bir doğrultuda istediğim noktaya ulaşmasını bresenham’ın yöntemini kullanarak yapardım. Son zamanlarda bezier curve’lar kullanarak işi birazcık daha “tuhaf”hale getirdiğimi söyleyebilirim. Ama mütemadiyen ihtiyaç duyacağım bir kod olduğu için buraya yazayım, ilerde yine unuttuğumda buraya bakarım.

Bresenham’s line algorithm ve Xiaolin_Wu’s line algorithm

Eğer Bresenham’ın algoritmasını Sinclair Basic üzerinde denemek istiyorsanız kodu uyarladım, buyrun okuyun:Bu kod 110 numaralı satırdan başlar ve x0,y0-x1,y1 girdilerini alır, burada 20 numaralı satırda kordinatlar rastgele hazırlanıyor, 250 numaralı satırda da başa dönüyoruz.

20 LET x0=RND*256: LET x1=RND*256: LET y1=RND*170: LET y0=RND*170
110 REM line draw function
120 LET steep=ABS (y1-y0)>ABS (x1-x0)
130 IF steep THEN LET xb=x0: LET x0=y0: LET y0=xb: LET xb=x1: LET x1=y1: LET y1=xb
140 IF x0>x1 THEN LET xb=x0: LET x0=x1: LET x1=xb: LET xb=y1: LET y1=y0: LET y0=xb
150 LET dx=x1-x0
160 LET dy=ABS (y1-y0)
170 LET e=dx/2
180 LET y=y0
185 LET ystep=-1
190 IF y0<y1 THEN LET ystep=1
200 FOR x=x0 TO x1
210 IF steep THEN PLOT y,x: GO TO 220
215 PLOT x,y
220 LET e=e-dy
230 IF e<0 THEN LET y=y+ystep: LET e=e+dx
240 NEXT x
250 GO TO 20

eğer yukarıdaki version çalışmıyorsa, sayfa kaynağını açarak aşağıdan copy etmeyi deneyin:

20 LET x0=RND*256: LET x1=RND*256: LET y1=RND*170: LET y0=RND*170
110 REM line draw function
120 LET steep=ABS (y1-y0)>ABS (x1-x0)
130 IF steep THEN LET xb=x0: LET x0=y0: LET y0=xb: LET xb=x1: LET x1=y1: LET y1=xb
140 IF x0>x1 THEN LET xb=x0: LET x0=x1: LET x1=xb: LET xb=y1: LET y1=y0: LET y0=xb
150 LET dx=x1-x0
160 LET dy=ABS (y1-y0)
170 LET e=dx/2
180 LET y=y0
185 LET ystep=-1
190 IF y0

Leave a Reply

Your email address will not be published. Required fields are marked *