Bu algoritma bir satırı taramak için kullanılır. Bresenham tarafından geliştirilmiştir. Yalnızca tamsayılarda toplama, çıkarma ve çarpma işlemlerini içerdiğinden etkili bir yöntemdir. Bu işlemler çok hızlı bir şekilde gerçekleştirilebildiğinden satırlar hızlı bir şekilde oluşturulabilmektedir.
Bu yöntemde seçilen bir sonraki piksel, gerçek çizgiye en az mesafeye sahip olandır.
Yöntem şu şekilde çalışır:
Bir piksel P varsayalım1'(X1',Ve1'), ardından mayıs ayından geceye kadar çalışırken sonraki pikselleri seçin, P'ye doğru yatay yönde her seferinde bir piksel konumu2'(X2',Ve2').
Herhangi bir adımda bir piksel seçildiğinde
Bir sonraki piksel
dize Java içerir
- Ya sağındaki (satırın alt sınırı)
- Biri sağda ve yukarısında (çizginin üst sınırı)
Çizgi, P arasındaki yoldan en az mesafeye düşen piksellerle en iyi şekilde tahmin edilir.1',P2'.
Alt piksel S ile üst piksel T arasında bir sonrakini seçmek için.
S seçilirse
elimizde x varben+1=xBen+1 ve yben+1=yBen
T seçilirse
elimizde x varben+1=xBen+1 ve yben+1=yBen+1
Doğrunun x = x noktasındaki gerçek y koordinatlarıben+1dır-dir
y=mxben+1+b
S'den y yönünde gerçek çizgiye olan mesafe
s = y-yBen
T'den y yönünde gerçek çizgiye olan mesafe
t = (yBen+1)-y
Şimdi bu 2 mesafe değeri arasındaki farkı düşünün
s - t
Ne zaman (s-t)<0 ⟹ s < t< p>
En yakın piksel S'dir
(s-t) ≧0 ⟹ sn olduğunda En yakın piksel T'dir Bu fark m'yi yerine koyma ve karar değişkeninin tanıtılması Burada c= 2△y+△x (2b-1) Karar değişkenini d yazabilirizben+1bir sonraki kayma için x_(i+1)=x olduğundanBen+1, elimizde Özel Durumlar Seçilen piksel T pikselinin üst kısmındaysa (yani, dBen≧0)⟹ veben+1=yBen+1 Seçilen piksel T pikselinin alt kısmındaysa (yani, dBen<0)⟹ yi+1=yBen Son olarak d'yi hesaplıyoruz1 mx'den beri1+b-yBen=0 ve m = , sahibiz 1. Yalnızca tamsayı aritmetiği içerir, dolayısıyla basittir. 2. Yinelenen noktaların oluşmasını önler. 3. Çarpma ve bölme kullanılmadığı için donanım kullanılarak gerçekleştirilebilir. 4. DDA Algoritması gibi kayan nokta hesaplamaları içermediğinden DDA (Dijital Diferansiyel Analizör) ile karşılaştırıldığında daha hızlıdır. 1. Bu algoritma yalnızca temel çizgi çizmeye yöneliktir. Başlatma, Bresenham'ın çizgi algoritmasının bir parçası değildir. Yani düzgün çizgiler çizmek için farklı bir algoritmaya bakmanız gerekir. Aşama 1: Algoritmayı Başlat Adım 2: Değişken x'i bildirin1,X2,Ve1,Ve2,d,i1,Ben2,dx,dy Aşama 3: X'in değerini girin1,Ve1,X2,Ve2 Adım4: dx = x'i hesaplayın2-X1 Adım 5: (x, y)'yi başlangıç noktası ve x olarak düşününsonx'in mümkün olan maksimum değeri olarak. Adım 6: (x,y) koordinatlarında nokta oluşturun. Adım 7: Tüm satırın oluşturulup oluşturulmadığını kontrol edin. Adım 8: Sonraki pikselin koordinatlarını hesapla Adım 9: Artış x = x + 1 Adım 10: En son (x, y) koordinatlarının bir noktasını çizin Adım 11: 7. adıma git Adım 1/2: Algoritmanın Sonu Örnek: Çizginin Başlangıç ve Bitiş konumları (1, 1) ve (8, 5)'tir. Ara noktaları bulun. Çözüm: X1=1 Çıktı:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
DBen=△x (s-t)
DBen=△x (2 (XBen+1)+2b-2yBen-1)
=2△xyBen-2△y-1△x.2b-2yBen△x-△x
DBen=2△y.xBen-2△x.yBen+c
Dben+1=2△y.xben+1-2△x.yben+1+c
Dben+1-DBen=2△y.(xben+1-XBen)- 2△x(yben+1-VeBen)
Dben+1+dBen=2△y.(xBen+1-xBen)- 2△x(yben+1-VeBen)
dizeyi json java'ya dönüştür
Dben+1=dBen+2△y-2△x
Dben+1=dBen+2△y0)⟹>
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+b-y1)+2m-1]
D1=2△y-△xAvantajı:
c++ dizesinde bul
Dezavantajı:
Bresenham Çizgi Algoritması:
nerede x1,Ve1başlangıç noktasının koordinatlarıdır
ve x2,Ve2Bitiş noktasının koordinatlarıdır
dy = y'yi hesaplayın2-Ve1
i'yi hesapla1=2*sen
i'yi hesapla2=2*(dy-dx)
d=i'yi hesapla1-dx
Eğer dx<0
O zaman x = x2
y = y2
Xson=x1
Eğer dx > 0 ise
O zaman x = x1
y = y1
Xson=x20>
Eğer x > = xson
Durmak.
Eğer d<0
O zaman d = d + i1
Eğer d ≧ 0 ise
O zaman d = d + i2
y'yi artırın = y + 10>1'den 100'e kadar roma rakamları
Ve1=1
X2=8
Ve2=5
dx=x2-X1=8-1=7
sen=y2-Ve1=5-1=4
BEN1=2* ∆y=2*4=8
BEN2=2*(∆y-∆x)=2*(4-7)=-6
d = ben1-∆x=8-7=1
X Ve d=d+ı1ya da ben2 1 1 d+ı2=1+(-6)=-5 2 2 d+ı1=-5+8=3 3 2 d+ı2=3+(-6)=-3 4 3 d+ı1=-3+8=5 5 3 d+ı2=5+(-6)=-1 6 4 d+ı1=-1+8=7 7 4 d+ı2=7+(-6)=1 8 5 Bresenham Çizgi Çizim Algoritmasını uygulama programı:
#include #include void drawline(int x0, int y0, int x1, int y1) { int dx, dy, p, x, y; dx=x1-x0; dy=y1-y0; x=x0; y=y0; p=2*dy-dx; while(x=0) { putpixel(x,y,7); y=y+1; p=p+2*dy-2*dx; } else { putpixel(x,y,7); p=p+2*dy;} x=x+1; } } int main() { int gdriver=DETECT, gmode, error, x0, y0, x1, y1; initgraph(&gdriver, &gmode, 'c:\turboc3\bgi'); printf('Enter co-ordinates of first point: '); scanf('%d%d', &x0, &y0); printf('Enter co-ordinates of second point: '); scanf('%d%d', &x1, &y1); drawline(x0, y0, x1, y1); return 0; }
DDA Algoritması ile Bresenham Çizgi Algoritması arasındaki farkı ayırt edin:
DDA Algoritması Bresenham Çizgi Algoritması 1. DDA Algoritması kayan noktayı, yani Gerçek Aritmetiği kullanır. 1. Bresenham'ın Doğru Algoritması sabit nokta kullanır, yani Tamsayı Aritmetiği 2. DDA Algoritmaları işleminde çarpma ve bölmeyi kullanır 2.Bresenham Çizgi Algoritması işleminde yalnızca çıkarma ve toplama işlemlerini kullanır 3. DDA Algoritması, gerçek aritmetik kullandığından (Kayan Nokta işlemi) çizgi çiziminde Bresenham'ın Çizgi Algoritmasından daha yavaştır. 3. Bresenham Algoritması, DDA Algoritmasından daha hızlıdır çünkü hesaplamasında yalnızca toplama ve çıkarma işlemlerini içerir ve yalnızca tamsayı aritmetiği kullanır. 4. DDA Algoritması, Bresenham'ın Çizgi Algoritması kadar doğru ve verimli değildir. 4. Bresenham'ın Çizgi Algoritması DDA Algoritmasına göre daha doğru ve verimlidir. 5.DDA Algoritması daire ve eğriler çizebilir ancak Bresenham Çizgi Algoritması kadar doğru değildir 5. Bresenham'ın Çizgi Algoritması, DDA Algoritmasından daha doğru bir şekilde daire ve eğriler çizebilir.