J.E. Bressenham pada th.1965 mengumumkan penemuan algoritma untuk mengoptimalkan gambar garis pada raster. Algoritma garis Bressenham disebut juga Midpoint Line Algorithm.
Algoritma temuannya tidak lagi menggunakan floating point arihtmetic, sehingga tidak perlu membulatkan nilai posisi piksel setiap waktu dan dalam pengulangan (looping) hanya menggunakan pengoperasian incremental. Algoritma ini hampir dapat dipergunakan dan diimplementasikan pada semua hardware dan software untuk keperluan penggambaran garis. Algoritma Bressenham dapat memperbaiki pengendalian plotter, sehingga dia mendapatkan hak paten. Algoritma ini hanya berlaku untuk nilai kemiringan garis : 0 < m < 1.
Perhatikan Gambar 2.7. Misalkan kemiringan garis m, yang besarnya adalah 0 < m < 1, titik awal garis di (x0, y0) dan titik akhir garis di (x1, y1). Anggap posisi titik sekarang (xp, yp) dan sekarang kita harus memilih antara titik E (East) atau NE (Northeast). Misalkan Q adalah titik potong garis dengan garis x = xp+1, dan M adalah titik tengah antara E dan NE. Jika titik tengah M terletak diatas garis, E dipilih, tetapi jika titik tengah M terletak dibawah garis, maka NE dipilih.
M
E
NE
(xp, yp) x =xp +1
Garis aktual
Gambar 3. 5 Garis mempunyai kemiringan 0 < m < 1, pada titik x= xp+1, garis berada diantara dua titik E dan NE yang mempunyai titik tengah di M. Dalam hal ini kita harus menentukan apakah garis berada diatas titik tengah M atau dibawah titik tengah M. Untuk melakukan ini, kita amati bahwa setiap garis bisa dinyatakan sebagai berikut; F(x, y) = ax + by + c = 0
Persamaan 3 - 1 Hitung: dy = y1 – y0 dan dx = x1 – x0, maka garis juga bisa ditulis sebagai:
y = mx + B = (dy/dx) x + B atau
Kalikan dengan dx menjadi (dy)x – (dx)y + (dx)B = 0
Diperoleh a = dy, b = −dx dan c = (dx)B.
Jika F(x, y) = 0, maka (x, y) terletak pada garis Jika F(x, y) > 0, maka (x, y) terletak dibawah garis
jika F(x, y) < 0, maka (x, y) terletak diatas garis
Untuk menerapkan kriteria midpoint, kita hitung: F(M) = F(xp + 1, yp + ½) = a (xp + 1) + b (yp + ½) + c Dan menguji tanda dari d = F(M).
Jika d >0, M terletak dibawah garis, maka NE dipilih.
Jika d = 0, pilih E ( sebenarnya memilih NE juga bisa)
Jika d < 0, M terletak diatas garis, maka E dipilih.
Misalkan E dipilih, M bertambah satu langkah dalam arah x, dan kita mempunyai d baru misalnya dbaru.
dbaru = F(xp + 2, yp + ½) = a (xp + 2) + b (yp + ½) + c dlama = F(xp + 1, yp + ½) = a (xp + 1) + b (yp + ½) + c jadi dbaru –dlama = a = dy.
Jadi setelah E dipilih, pertambahan untuk mendapatkan d yang baru adalah a = dy.
Misalkan NE dipilih, M adalah pertambahan satu langkah kearah x dan y sehingga
dbaru = F(xp + 2, yp + 3/2) = a (xp + 2) + b (yp +3/2) + c dlama = F(xp + 1, yp + ½) = a (xp + 1) + b (yp + ½) + c jadi dbaru – dlama = a + b = dy – dx.
Untuk memulai algoritma, titik awal adalah (xp , yp ) = (x0, y0). Untuk menghitung nilai d yang pertama untuk memulai algoritma, midpoint pertama adalah (x0 + 1, y0 + ½) dan
F(M) = F(x0 + 1, y0 + ½) = a (x0 + 1) + b (y0 + ½)+ c = ax0 + by0 + c + a + b/2
= 0 + a + b/2 karena (x0, y0) terletak pada garis. Jadi kita mulai dari d = a + b/2 = dy – dx/2
Untuk menghilangkan pecahan, definisikan F dengan mengalikan 2, diperoleh
F(x,y) = 2 (ax + by + c) = 0.
Definisi ini akan menyebabkan nilai d menjadi d = 2dy – dx Dengan begini algoritma midpoint Bresenham (untuk kemiringan 0 < m < 1) adalah :
1) Tentukan dua titik yang akan dihubungkan dalam pembentukan garis.
2) Tentukan salah satu sebagai titik awal (x0, y0) dan titik akhir (x1, y1).
3) Hitung dx, dy, 2|dy| dan 2|dy| − 2|dx| 4) Hitung parameter : po = 2|dy| − |dx|
- bila pk < 0 maka titik selanjutnya adalah: (xk+1, yk) dan pk+1 = pk + 2|dy|
- bila tidak, titik selanjutnya adalah: (xk+1, yk+1) dan pk+1 = pk + 2|dy| – 2|dx|
6) Ulangi nomor 5 untuk menentukan posisi piksel berikutnya, sampai
x = x1 dan y = y1.
Contoh 2.5
Diketahui 2 buah titik A(2,1) dan titik B(8,5) bila titik A sebagai titik awal dan titik B sebagai titik akhir, maka buatlah garis yang menghubungkan titik tersebut dengan menggunakan algoritma Bressenham.
Jawab:
Titik awal (x0, y0) = A(2,1) dan Titik akhir (x1, y1) = B(8,5)
dx = x1 − x0 = 8 −2 = 6 dan dy = y1 − y0 = 5 − 1 = 4 m = dy/ dx = 4/6 ; kemiringan garis berada diantara 0 dan 1 : 0 < m < 1
2|dx|= 2.6 = 12 ; 2|dy|= 2.4 = 8 dan 2|dy| – 2|dx| = 8 − 12 = −4
================================================= Iterasi ke-1 ( k = 0):
Titik awal = (2,1)
Po = 2 > 0, maka titik selanjutnya adalah
x = 2 + 1 = 3 dan y = 1 + 1 = 2, koordinat selanjutnya : (3,2)
p1 = p0 + 2|dy| – 2|dx| = 2 − 4 = −2
================================================= Iterasi ke-2 ( k = 1):
Titik awal = (3,2)
P1 = −2 < 0, maka titik selanjutnya adalah
x = 3 + 1 = 4 dan y = 2, koordinat selanjutnya : (4,2) p2 = p1 + 2|dy| = −2 + 8 = 6
================================================= Iterasi ke-3 ( k = 2):
Titik awal = (4,2)
P2 = 6 > 0, maka titik selanjutnya adalah
x = 4 + 1 = 5 dan y = 2 + 1 = 3, koordinat selanjutnya : (5,3)
p3 = p2 + 2|dy| – 2|dx| = 6 − 4 = 2
Iterasi ke-4 ( k = 3): Titik awal = (5,3)
P3 = 2 > 0, maka titik selanjutnya adalah
x = 5 + 1 = 6 dan y = 3 + 1 = 4, koordinat selanjutnya : (6,4)
p4 = p3 + 2|dy| – 2|dx| = 2 − 4 = −2
================================================= Iterasi ke-5 ( k = 4):
Titik awal = (6,4)
P3 = −2 < 0, maka titik selanjutnya adalah
x = 6 + 1 = 7 dan y = 4, koordinat selanjutnya : (7,4) p5 = p4 + 2|dy| = −2 + 8 = 6
================================================= Iterasi ke-6 ( k = 5):
Titik awal = (7,4)
P5 = 6 > 0, maka titik selanjutnya adalah
x = 7 + 1 = 8 dan y = 4 + 1 = 5, koordinat selanjutnya : (8,5)
Karena x = x2 = 8, maka iterasi dihentikan, sehingga diperoleh titik-titik penyusun garis sebagai berikut: (2,1), (3,2), (4,2), (5,3), (6,4), (7,4) dan (8,5).
Bila digambar pada raster graphics diperoleh Gambar 2.8:
Gambar 3. 6 Titik-titik pembentuk garis dengan kemiringan 0 < m < 1, hasil perhitungan menggunakan algoritma Bressenham yang digambar pada raster
graphics.
Untuk kemiringan −1 < m < 0 , kita tinggal mengganti komponen berikut:
Untuk setiap xk sepanjang jalur garis, dimulai dengan k = 0 - bila pk < 0 maka titik selanjutnya adalah:
(xk+1, yk) dan pk+1 = pk + 2|dy| - bila tidak, titik selanjutnya adalah: (xk+1, yk−1) dan pk+1 = pk + 2|dy| – 2|dx| 1 2 3 4 5 6 7 8 9 10 11 7 6 5 4 3 2 2 1
Contoh 2.6
Diketahui 2 buah titik A(2,9) dan titik B(8,5) bila titik A sebagai titik awal dan titik B sebagai titik akhir, maka buatlah garis yang menghubungkan titik tersebut dengan menggunakan algoritma Bressenham.
Jawab:
Titik awal (x0, y0) = A(2,9) dan Titik akhir (x1, y1) = B(8,5)
dx = x1 − x0 = 8 −2 = 6 dan dy = y1 − y0 = 5 − 9 = −4 m = dy/ dx = −4/6 ; kemiringan garis berada diantara −1 dan 0 : −1 < m < 0
2|dx|= 2.6 = 12 ; 2|dy| = 2.|−4| = 8 dan 2|dy| − 2|dx| = 8 − 12 = −4
po = 2|dy| − |dx| = 8 − 6 = 2
================================================= Iterasi ke-1 ( k = 0):
Titik awal = (2,9)
Po = 2 > 0, maka titik selanjutnya adalah
x = 2 + 1 = 3 dan y = 9 −1 = 8, koordinat selanjutnya : (3,8)
p1 = p0 + 2|dy| − 2|dx|= 2−4 = −2
Iterasi ke-2 ( k = 1): Titik awal = (3,8)
P1 = −2 < 0, maka titik selanjutnya adalah
x = 3 + 1 = 4 dan y = 8, koordinat selanjutnya : (4,8) p2 = p1 + 2|dy| = −2 + 8 = 6
================================================= Iterasi ke-3 ( k = 2):
Titik awal = (4,8)
P2 = 6 > 0, maka titik selanjutnya adalah
x = 4 + 1 = 5 dan y = 8 – 1 = 7, koordinat selanjutnya : (5,7)
p3 = p2 + 2|dy| − 2|dx|= = 6 – 4 = 2
================================================= Iterasi ke-4 ( k = 3):
Titik awal = (5,7)
P2 = 2 > 0, maka titik selanjutnya adalah
x = 5 + 1 = 6 dan y = 7 – 1 = 6, koordinat selanjutnya : (6,6)
p4 = p3 + 2|dy| − 2|dx|= = 2 – 4 = –2
================================================= Iterasi ke-5 ( k = 4):
Titik awal = (6,6)
P4 = −2 < 0, maka titik selanjutnya adalah
x = 6 + 1 = 7 dan y = 6, koordinat selanjutnya : (7,6) p5 = p4 + 2|dy| = −2 + 8 = 6
================================================= Iterasi ke-6 ( k = 5):
Titik awal = (7,6)
P5 = 6 > 0, maka titik selanjutnya adalah
x = 7 + 1 = 8 dan y = 6 – 1 = 5, koordinat selanjutnya : (8,5)
p6 = p5 + 2|dy| − 2|dx| = 6 – 4 = 2
================================================= Karena x = x2 = 8, maka iterasi dihentikan, sehingga diperoleh titik-titik penyusun garis sebagai berikut: (2,9), (3,8), (4,8), (5,7), (6,6), (7,6) dan (8,5).
Gambar 3. 7 Titik-titik pembentuk garis dengan kemiringan −1 < m < 0, hasil perhitungan menggunakan algoritma Bressenham yang digambar pada
raster graphics.
Untuk kemiringan garis m > 1, tukarlah x dengan y, sehingga algoritma pembentukan garis untuk m > 1 adalah sebagai berikut: 1. Tentukan dua titik yang akan dihubungkan dalam
pembentukan garis.
2. Tentukan salah satu sebagai titik awal (x0, y0) dan titik akhir (x1, y1).
3. Hitung dx, dy, 2|dx| dan 2|dx| − 2|dy| 4. Hitung parameter : po = 2|dx| − |dy|
1 2 3 4 5 6 7 8 9 10 11 7 6 5 4 3 2 2 1 10
5. Untuk setiap yk sepanjang jalur garis, dimulai dengan k = 0 - bila pk < 0 maka titik selanjutnya adalah:
(xk, yk+1) dan pk+1 = pk + 2|dx| - bila tidak, titik selanjutnya adalah: (xk+1, yk+1) dan pk+1 = pk + 2|dx| − 2|dy|
6. Ulangi nomor 5 untuk menentukan posisi piksel berikutnya, sampai
x = x1 dan y = y1.
Contoh 2.7
Diketahui 2 buah titik A(2,1) dan titik B(4,7) bila titik A sebagai titik awal dan titik B sebagai titik akhir, maka buatlah garis yang menghubungkan titik tersebut dengan menggunakan algoritma Bressenham.
Jawab:
Titik awal (x0, y0) = A(2,1) dan Titik akhir (x1, y1) = B(4,7)
dx = x1 − x0 = 4 −2 = 2 dan dy = y1 − y0 = 7 − 1 = 6 m = dy/ dx = 6/2 ; kemiringan garis lebih besar dari 1 : m > 1
2|dx|= 4 ; 2|dy| = 12 dan 2|dx| − 2|dy| = 4 − 12 = −8
po = 2|dx| − |dy| = 4 − 6 = −2
================================================= Iterasi ke-1 ( k = 0):
Titik awal = (2,1)
po = −2 < 0, maka titik selanjutnya adalah
x = 2 dan y = 1 + 1 = 2, koordinat selanjutnya : (2,2) p1 = po + 2|dx| = −2 + 4 = 2
================================================= Iterasi ke-2 ( k = 1):
Titik awal = (2,2)
p1 = 2 > 0, maka titik selanjutnya adalah
x = 2+1 = 3 dan y = 2 + 1 = 3, koordinat selanjutnya : (3,3)
p2 = p1 + 2|dx| − 2|dy| = 2 − 8 = −6
================================================= Iterasi ke-3 ( k = 2):
Titik awal = (3,3)
p2 = −6 < 0, maka titik selanjutnya adalah
x = 3 dan y = 3 + 1 = 4, koordinat selanjutnya : (3,4) p3 = p2 + 2|dx| = −6 + 4 = −2
================================================= Iterasi ke-4 ( k = 3):
Titik awal = (3,4)
p3 = −2 < 0, maka titik selanjutnya adalah
x = 3 dan y = 4 + 1 = 5, koordinat selanjutnya : (3,5) p4 = p3 + 2|dx| = −2 +4 = 2
================================================= Iterasi ke-5 ( k = 4):
Titik awal = (3,5)
p4 = 2 > 0, maka titik selanjutnya adalah
x = 3+1=4 dan y = 5 + 1 = 6, koordinat selanjutnya : (4,6)
p5 = p4 + 2|dx| − 2|dy| = 2 − 8 = −6
================================================= Iterasi ke-6 ( k = 5):
Titik awal = (4,6)
p5 = −6 < 0, maka titik selanjutnya adalah
x = 4 dan y = 6 + 1 = 7, koordinat selanjutnya : (4,7) p6 = p5 + 2|dx| = −6 + 4 = −2
Sampai disini iterasi dihentikan.
Untuk kemiringan garis m < −1, kita tinggal mengganti komponen berikut:
Untuk setiap yk sepanjang jalur garis, dimulai dengan k = 0 - bila pk < 0 maka titik selanjutnya adalah:
(xk, yk−1) dan pk+1 = pk + 2|dx| - bila tidak, titik selanjutnya adalah:
(xk+1, yk−1) dan pk+1 = pk + 2|dx| − 2|dy|
Contoh 2.8
Diketahui 2 buah titik A(−6,10) dan titik B(0,0) bila titik A sebagai titik awal dan titik B sebagai titik akhir, maka buatlah garis yang menghubungkan titik tersebut dengan menggunakan algoritma Bressenham.
Jawab:
Titik awal (x0, y0) = A(−6,10) dan Titik akhir (x1, y1) = B(0,0)
dx = x1 − x0 = 0 – (−6) = 6 dan dy = y1 − y0 = 0 − 10 = −10
m = dy/ dx = −10 /6 ; kemiringan garis lebih kecil dari −1 : m < −1
2|dx| = 12 ; 2|dy| = 20 dan 2|dx| − 2|dy| = 12 − 20 = −8 po = 2|dx| − |dy| = 12 − 10 = 2 ================================================= Iterasi ke-1 ( k = 0): Titik awal = (−6,10)
po = 2 > 0, maka titik selanjutnya adalah
x = −6 + 1 = −5 dan y = 10 − 1 = 9, koordinat selanjutnya : (−5,9)
p1 = po + 2|dx| − 2|dy| = 2 − 8 = −6
================================================= Iterasi ke-2 ( k = 1):
Titik awal = (−5,9)
P1 = −6< 0, maka titik selanjutnya adalah
x = −5 dan y = 9 − 1 = 8, koordinat selanjutnya : (−5,8) p2 = p1 + 2|dx| = −6 + 12 = 6
================================================= Iterasi ke-3 ( k = 2):
Titik awal = (−5,8)
x = −5 + 1 = −4 dan y = 8 − 1 = 7, koordinat selanjutnya : (−4,7) p3 = p2 + 2|dx| − 2|dy|= 6 − 8 = −2 ================================================= Iterasi ke-4 ( k = 3): Titik awal = (−4,7)
P3 = −2 < 0, maka titik selanjutnya adalah
x = −4 dan y = 7 − 1 = 6, koordinat selanjutnya : (−4,6) p4 = p3 + 2|dx| = −2 + 12 = 10
================================================= Iterasi ke-5 ( k = 4):
Titik awal = (−4,6)
P4 = 10 > 0, maka titik selanjutnya adalah
x = −4 + 1 = −3 dan y = 6 − 1 = 5, koordinat selanjutnya : (−3,5)
p5 = p4 + 2|dx| − 2|dy| = 10 −8 = 2
================================================= Iterasi ke-6 ( k = 5):
Titik awal = (−3,5)
x = −3 + 1 = −2 dan y = 5 − 1 = 4, koordinat selanjutnya : (−2,4) p5 = p4 + 2|dx| − 2|dy| = 2 − 8 = − 6 ================================================= Iterasi ke-7 ( k = 6): Titik awal = (−2,4)
P3 = −6 < 0, maka titik selanjutnya adalah
x = −2 dan y = 4 − 1 = 3, koordinat selanjutnya : (−2,3) p4 = p3 + 2|dx| = −6 + 12 = 6
================================================= Iterasi ke-8 ( k = 7):
Titik awal = (−2,3)
P7 = 6 > 0, maka titik selanjutnya adalah
x = −2 + 1 = −1 dan y = 3 − 1 = 2, koordinat selanjutnya : (−1,2)
p8 = p7 + 2|dx| − 2|dy| = 6 − 8 = −2
================================================= Iterasi ke-9 ( k = 8):
Titik awal = (−1,2)
P8 = −2 < 0, maka titik selanjutnya adalah
p9 = p8 + 2|dx| = −2 + 12 = 10
================================================= Iterasi ke-10 ( k = 9):
Titik awal = (−1,1)
P9 = 10 > 0, maka titik selanjutnya adalah
x = −1 + 1 = 0 dan y = 1 − 1 = 0, koordinat selanjutnya : (0,0)
p10 = p9 + 2|dx| − 2|dy| = 10 −8 = 2
================================================= Sampai disini iterasi dihentikan.