Matakuliah Grafika Komputer memang
sungguh mengasikan sekaligus membuat pening kepala ini. Kesibukan Saya
sehari-hari adalah santai. Jika orang-orang sibuk beraktivitas, maka Saya lebih
senang menyibukan diri dengan bersantai. Mungkin pola aktivitas tersebut yang
mempengaruhi Saya ogah berfikir rumit. Jadi, harap dimaklum ya jika kata
pembuka yang saya ungkapkan kurang bersemangat.
Pada pertemuan 4 praktikum dan
kuliah grafika komputer, Saya merasa sedang bernostalgia dengan masa-masa
menegangkan Saya, ketika mengambil mata kuliah Algoritma dan Pemrograman.
Karena pada pertemuan 4 ini, Pak Dosen menerangkan cara penggunaan algoritma
dalam OpenGL, khususnya yang akan dibahas adalah Algoritma DDA dan Bresenham.
Mari kita diskusikan satu persatu.
Algoritma DDA
Seperti dikutif pada modul
praktikum Saya, bahwa suatu paket pendekatan grafik raster dari grafik primitif
( titik, garis, dan poligon) dideskripsikan dalam suatu sistem koordinat 2D,
melalui letak pixel-pixel dalam pixmap ke pendekatan intensitas atau warna.
Konversi (conversion) dari primitif ke pixmap secara umum dikenal dengan nama
scan conversion. Scan converting lines ( konversi scan garis). Scan conversi
biasa akan menghitung pixel-pixel yang berada pada sekitar garis lurus pada
suatu pixmap (suatu raster grid). Algoritma scan conversion akan menghasilkan
suatu garis dengan brightness konstan (tidak tergantung pada panjang dan
orientasi) dan hal ini bekerja dengan cepat.
Persmaan garis menurut koordinat
Cartesian adalah
y= m.x+c (4.1)
dimana m adalah slope
(kemiringan) dari garis yang dibentuk dari dua titik, (x1, y1) dan (x2,
y2).untuk penambahan x sepanjang garis yaitu dx akan mendapatkan penambahan
sebesar dy = m.dx.
Dari persamaan y = mx +c, dengan
m mewakili kemiringan dan c adalah merupakan titik pada sumbu y. Jika diketahui
dua titik akhir dari segmen garis diposisikan pada (x1,y1) dan (x2,y2), maka
cara menentukan kemiringan garis tersebut adalah :
Dari persamaan (4.2) dengan nilai
x sembarang dan interval x ∆ berada pada sepanjang garis , maka hubungannya
dengan interval y ∆ adalah sebagai berikut : x my ∆ =∆ . dan dengan cara yang
sama maka akan didapatkan pula interval x∆ yang dihubungkan dengan ∆y
adalah sebagai ∆x = ∆y/m.
DDA (Digital Differential
Analyzer) merupakan suatu algoritma garis-garis konversi pembacaan yang
didasarkan pada perhitungan y ∆ atau x ∆ dengan menggunakan persamaan di atas.
Berikut ini adalah langkah-langkah pembentukan garis dengan menggunakan algoritma
DDA :
Tentukan
dua titik yang akan dihubungkan dalam pembentukan garis.
- Tentukan dua titik yang akan dihubungkan dalam pembentukan garis.
- Tentukan salah satu titik sebagai titik awal (x1,y1) dan titik akhir (x2,y2).
- Hitung ∆x = x2 – x1 dan ∆x = x2 – x1
- Tentukan step, yaitu jarak maksimum jumlah pembuatan nilai x maupun nilai y, melalui
Jika nilai |∆x|
> |∆y| , maka step =|∆x|
Jika tidak maka
step = |∆y|
- Hitung koordinat pixel selanjutnya dengan cara x_tambah = ∆x / step dan y_tambah = ∆y / step
- Tentukan koordinat berikutnya (xi+1 , yi+1) dengan kkordinat (x+x_tambah, y+y_tambah).
- Posisi pixel di layer ditentukan dengan pembulatan nilai koordinat tersebut.
- Ulangi langkah 5 ean 6 untuk menentukan posisi pixel selanjutnya, sampai x= x1 dan y = y1
Sedangkan algoritma pembangkitan
garis Bresenham langkah-langkahnya adalah sebagai berikut (untuk 1 <m ) :
- Masukkan dua titik akhir dan simpan titik akhir sebelah kiri dalam (X0,y0)
- Isikan (x0,yo) ke dalam frame buffer, yang akan melukis titik pertama
- Hitung konstanta Dx, Dy, 2Dx, 2Dy dan dapatkannilai awal untuk parameter awal keputusan sebagai berikut :
p0 = 2Dy - Dx
- Pada masing-masing xk sepanjang garis, dimulai dengan k = 0, lakukan tes berikut ini :
Jika pk<0 dan titik berikutnya
adalah (xk +1, yk) dan selain itu titik berikutnya yang dilukis adalah :
Pk+1 = pk+2Dy
– 2Dx
- Ulangi langkah 4 sebanyak Dx kali.
Contoh Program :
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <glut.h>
#include <math.h>
Kode program diatas
berfungsi untuk import library yang akan digunakan
<stdlib> digunakan
untuk membersihkan layar sama dengan <windows.h>
<string> library yang
menyimpan fungsi-fungsi dalam penangan string atau substring
<Stdarg.h> librar yang
mengijinkan pendefinisian angka
<glut>library grafik
dari opengl
<math.h> merupakan
library yang mengijinkan untuk memanggil fungsi matematika
void display(void)
{
//merubah tampilan latar belakang
window menjadi putih
glClearColor(1.0,1.0,1.0,0.0);
//Pengaturan parameter proyeksi
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,300.0,0.0,300.0);
}
void
setPixel(GLint xCoordinate, GLint yCoordinate) { glBegin(GL_POINTS);
glVertex2i(xCoordinate,yCoordinate);
glEnd();
glFlush();
}
//Prosedur
Bresenham line-drawing untuk |m| < 1.0
void
lineBres(GLint x0, GLint y0, GLint xEnd, GLint yEnd)
{
GLint dx = (float)fabs((float) xEnd - x0);
GLint dy = (float)fabs((float) yEnd - y0);
GLint p = 2 * dy - dx;
GLint twoDy = 2 * dy;
GLint twoDyMinusDx = 2 * (dy-dx);
GLint x,y;
// menentukan titik akhir untuk
digunakan sebagai posisi awal
if (x0 > xEnd){
x = xEnd;
y = yEnd;
xEnd = x;
}else{
x = x0;
y = y0;
} setPixel(x,y);
while(x<xEnd){ x++;
if(p<0) p += twoDy;
else{ y++;
p += twoDyMinusDx;
} setPixel(x,y);
}
} void drawMyLine(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPointSize(4.0);
GLint x0 = 100;
GLint y0 = 150;
GLint xEnd = 200;
GLint yEnd = 200;
lineBres(x0,y0,xEnd,yEnd);
} int main(int argc, char**
argv)
{
//isinialisasi GLUT
glutInit(&argc,argv);
//inisialisasi mode tampilan
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//set display-window width
& height
glutInitWindowSize(400,400);
//pengaturan tampilan posisi
window
glutInitWindowPosition(0,0);
//membuat judul windows
glutCreateWindow("Digital
Differential Analyzer Algorithm");
//inisialisasi
OpenGL display();
//memanggil fungsi frafis untuk
ditampilkn pada jendela
glutDisplayFunc(drawMyLine);
glutMainLoop();
return 0;
}
0 komentar: