Senin, 26 Desember 2016

OpenGL, Penggambaran Garis Dengan Algoritma DDA dan Bresenham



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;
      }





Previous Post
Next Post

post written by:

0 komentar: