Sebuah grafis primitif dapat didefinisikan sebagai fungsi gambar yang sistemnya tersedia untuk pemrograman aplikasi. Contoh nyata terdapat pada method drawLine(). Subjek apa yang harus tercakup dalam suatu sistem sebagai primitif bisa menjadi cukup kompleks karena perlu diberikan pertimbangan untuk properti dari alat tampilan. Alat tampilan bisa berupa layar komputer, printer, plotter, dll. Bahkan di dalam jenis perangkat/alat layar komputer memiliki beberapa bentuk alternatif (misalnya sebuah layar komputer menggunakan sistem vektor CRT, CRT raster system, atau menggunakan LCD. Pada sebuah printer mungkin menggunakan dot matrix, tinta jet, laser, dsb). Pada tingkat terendah setiap perangkat membutuhkan pengaturan sendiri primitifnya (perangkat keras primitif).
Untuk tampilan tipe raster pada tingkat terendah, kita hanya perlu menerapkan piksel (x,y) pada fungsi pemutus(on – off). Kita biasanya mengharapkan untuk bekerja pada tingkat yang lebih tinggi dengan pengaturan primitif yang lebih komprehensif, misalnya meliputi:Line, ellipse, arc, dsb. Untuk dokumentasi selengkapnya method-method dari kelas Graphics bisa lihat di dokumentasi JDK, saat ini sudah sampai JDK versi 7.
Pada pembahasan kali ini akan lebih menekankan pada algoritma pembentukan suatu garis dengan beberapa metode yang dapat diimplementasikan dalam java.
Menggambar Garis Lurus
Dimulai menggunakan method drawLine(), kita akan mempelajari metode untuk melakukannya dengan pendekatan brute force. Pada metode brute force ini gambar yang dihasilkan masih agak kasar, dan untuk menghasilkan yang lebih halus dan efisien solusinya lebih dikenal sebagai algoritma Bresenham.
1. Pendekatan Brute force
dan c mencegat dari sumbu y, atau bisa juga disebut titik perpotongan garis dengan sumbu y.
![]() |
| Menentukan garis-garis lurus |
Untuk setiap nilai x, kita dapat menghitung y. Untungnya dalam kuantisasi nilai integer di dunia komputer grafik dan tampilan bitmap kita tahu semua nilai dari x. Gambar di bawah menunjukkan sebuah bit yang dipetakan agak kasar pada baris matematis lurus digram sebelumnya.
![]() |
| Pencacahan nilai x |
Sebuah perulangan dapat digunakan untuk mengulang melalui semua nilai x antara xfrom dan xto dan dihitung untuk setiap nilai y yang sesuai.
for(int x= xfrom; x<xto; x++) {.......}
Untuk menggunakan persamaan 2, kita harus memiliki nilai untuk m dan c. Karena kita tahu dua titik pada garis ini dapat dihitung dengan mudah. Jadi routine (dalam pseudocode) untuk menggambar garis akan terlihat seperti berikut:
method lineDraw(xfrom,yfrom,xto,yto){
DeltaY = yto-yfrom;
DeltaX = xto-xfrom;
m = DeltaY/DeltaX;
c=yfrom - (m*xfrom);
for(int x= xfrom; x<xto; x++) {
y=(m*x) + c;
plotPoint(x,y)
}
}//lineDraw
Sayangnya, jika kita memilih koordinat untuk titik akhir sehingga garis tampak curam, ternyata gradien m adalah > 1 hasilnya terlihat seperti gambar berikut:
![]() |
| Algoritma brute force dengan gradien yang curam |
Kekosongan mulai muncul di garis. Mengapa ini terjadi? Melihat beberapa nilai untuk x dan y segera menunjukkan bahwa ketika m > 1, peningkatan nilai untuk y dengan jumlah yang lebih besar dari kenaikan x yang kita gunakan (yaitu > 1). Bandingkan baris
![]() |
| Perbandingan nilai x & y untuk gradien yang berbeda |
Solusi untuk masalah kekosongan adalah untuk selalu menggunakan variabel yang paling cepat berubah (x atau y) sebagai indeks ke perulangan (Gambar 3). yaitu Ketika gradien (m) > 1 - menggunakan y sebagai variabel kontrol dalam perulangan dan membuat subjek x dari persamaan:
![]() |
| Penggunaan variabel control berdasarkan pada gradient garis |
Ada masalah kedua dengan pendekatan brute force: hal ini membutuhkan aritmatika floating point yang lambat ketika dibandingkan dengan menggunakan hanya aritmatika bilangan bulat (integer). Suatu pendekatan yang sepenuhnya menggunakan bilangan bulat akan menghasilkan banyak algoritma yang lebih cepat.
Algoritma Bresenham
Salah satu algoritma yang hanya menggunakan integer adalah bresenham. Dimulai dengan mempertimbagkan kasus sederhana dimana 0<m<1
![]() |
| Gambar 4: Dasar algoritma bresenham |
to be continued... tulisan ini masih belum saya upload sepenuhnya karena beberapa alasan... untuk selanjutnya akan melanjutkan tulisan ini beserta implementasi ke sourcenya.








0 comments:
Post a Comment