Senin, 25 Oktober 2010

BRESENHEM (GRAFIK DAN PENGOLAHAN CITRA)


ALGORITMA UNTUK PENGGAMBARAN GARIS
Penggambaran grafik garis lurus dan kurva memerlukan waktu komputasi yang tinggi, untuk mereduksi waktu komputasi yang tinggi tersebut dapat dilakukan dengan peningkatan kemampuan komputasi prosesor dan peningkatan efisiensi algoritma. Algoritma Midpoint merupakan Algoritma dengan dasar operasi bilangan integer, sehingga memerlukan waktu operasi yanglebih sedikit dibandingkan dengan algoritma yang menggunakan operasi bilangan riel.
Implementasi ke dalam bahasa pemrograman C dari kedua macam algoritma diatas, menunjukkan bahwa waktu komputasi algoritma midpoint lebih cepat sebesar 8 kali pada pembuatan garis lurus, dan lebih cepat sebesar 15 kali pada penggambaran lingkaran, dibandingkan dengan waktu komputasi algoritma yang menggunakan dasar operasi bilangan riel. Dan waktu komputasi algoritma midpoint lebih cepat sebesar 6 kali pada pembuatan garis lurus, dibandingkan dengan waktu komputasi lgoritma yang Breserham telah menggunakan dasar operasi bilangan integer juga.
Kata kunci: Penggambaran garis, penggambaran kurva,
Algoritma Bresenham, Algoritma midpoint, Algoritma DDA.
.



2.1 Algoritma Bresenham
Bresenham pada tahun 1965, melakukan perbaikan dari algoritma perhitungan koordinat piksel yang menggunakan persamaan (1), dengan cara menggantikan operasi bilangan riel perkalian dengan operasi penjumlahan, yang kemudian dikenal dengan Algoritma Bresenham. Pada algoritma bresenham, nilai y kedua dan seterusnya, dihitung dari nilai y sebelumnya, sehingga hanya titik y pertama yang perlu dilakukan operasi secara lengkap. Perbaikan algoritma ini ternyata tidak menghasilkan perbaikan yang cukup siginifikan. Perbaikan berikutnya dilakukan dengan cara menghilangkan operasi bilangan riel dengan operasi bilangan integer. Operasi bilangan integer jauh lebih cepat dibandingkan dengan operasi bilangan riel, terutama pada penambahan dan pengurangan.











KESIMPULAN
Panjang garis atau banyak piksel dalam garis lurus sangat berpengaruh terhadap perbandingan performance antara sebuah algoritma dengan algoritma yang lain, hal ini disebabkan adanya perbedaan waktu operasi yang berada didalam perulangan sepanjang pembuatan piksel, dan waktu operasi yang berada pada sebelumnya. Panjang jari-jari dalam lingkaran tidak berpengaruh terhadap perbandingan performance antara sebuah algoritma dengan algoritma yang lain, hal ini menunjukkan perbandingan waktu operasi yang berada didalam perulangan sepanjang pembuatan piksel, dan waktu operasi yang berada pada sebelumnya berimbang.
Algoritma dengan dasar operasi bilangan integer memberikan waktu operasi yang lebih cepat dibandingkan dengan algoritma dengan dasar operasi bilangan riel, hal ini ditunjukkan dengan waktu komputasi algoritma DDA, algoritma Bresenham dan algoritma Midpoint yang lebih cepat, baik pada pembuatan garis lurus maupun lingkaran dibandingan waktu komputasi dengan algoritma yang menggunakan dasar operasi bilangan riel. Algoritma midpoint memberikan waktu operasi tercepat diantara algoritma penggambaran garis lurus yang telah menggunakan dasar operasi bilangan integer, seperti algoritma DDA, algoritma Bresenham. Jadi algoritma Midpoint merupakan algoritma yang cocok untuk penggambaran grafik yang menuntut kecepatan sebagai hal yang diutamakan.
Contoh       : algoritma Bresenham Garis menggunakan C++
Ini adalah sebagian Contoh Coding dari Algoritm Bresenham Garis Vertikal,Horizontal,dan Diagonal






Dan ini adalah Inputan dari coding Diatas      :
Ini adalah tampilan awal dari hasil output algortma brasenham :
Langkah selanjutnya kita akan inputkan program ini


Hasilnya untuk garis vertikal         :







Inputan program untuk horizontal :

Hasilnya adalah :

Sedangkan Untuk diagonal :
Hasilnya


#include <GL/glut.h>

#include <stdlib.h>

#include <cstdlib>
#include <iostream>

using namespace std;

void sumbu(){
     glPushMatrix();
     glBegin(GL_LINES);
                   glVertex3f(0, 0, 0.0);
                   glVertex3f(0, 1, 0.0);
        glVertex3f(0, 0, 0.0);
                   glVertex3f(1, 0, 0.0);
                   glClear(GL_COLOR_BUFFER_BIT);
              glColor3f(1.0, 1.0, 1.0);
          glPopMatrix();
    glEnd();
          glFlush();
     }
    
void Diagonal() {
     float a,b,c,d;
     cout<<"Masukan X0 : ";cin>>a;
     cout<<"Masukan Y0 : ";cin>>b;
     cout<<"Masukan X1 : ";cin>>c;
     cout<<"Masukan Y1 : ";cin>>d;
     glPushMatrix();
     glBegin(GL_LINES);
                   glVertex3f(a+0.5, b+0.5, 0.0);
                   glVertex3f(c+0.5, d+0.5, 0.0);
                   glClear(GL_COLOR_BUFFER_BIT);
              glColor3f(1.0, 1.0, 1.0);
          glPopMatrix();
    glEnd();
          glFlush();

}
void Horizontal() {
    
     float c,d,y;
     cout<<"Masukan XAwal :";cin>>c;
     cout<<"Masukan XAkhir :";cin>>d;
     cout<<"Masukan Ytetap :";cin>>y;
     glClear(GL_COLOR_BUFFER_BIT);
           glColor3f(1.0, 1.0, 1.0);
           glBegin(GL_LINES);
                   glVertex3f(c+0.1, y+0.1, 0.0);
                   glVertex3f(d+0.1, y+0.1, 0.0);
           glEnd();
           glFlush();
}
void Vertikal() {
    
    float a,b,x;
    cout<<"Masukan Yawal : ";cin>>a;
    cout<<"Masukan Yakhir : ";cin>>b;
    cout<<"Masukan Xtetap : ";cin>>x;
          glClear(GL_COLOR_BUFFER_BIT);
          glColor3f(1.0, 1.0, 1.0);
          glBegin(GL_LINES);
                   glVertex3f(x+0.5,a+0.5,0.0);
                   glVertex3f(x+0.5,b+0.5,0.0);
          glEnd();     
          glFlush();
}

void Initialize() {
          glClearColor(0.0, 0.0, 0.0, 0.0);
          glMatrixMode(GL_PROJECTION);
          glLoadIdentity();
          glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

int main(int iArgc, char** cppArgv) {
    menu:
    int a;
    cout<<"------MENU------\n";
    cout<<"1.Garis Vertikal\n";
    cout<<"2.Garis Horizontal\n";
    cout<<"3.Garis Diagonal\n";
    cout<<"4.Exit\n";
    cout<<"----------------\n"; 
    cout<<"Masukan pilihan anda:";cin>>a;
    cout<<"\n";  
          glutInit(&iArgc, cppArgv);
          glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
          glutInitWindowSize(500, 500);
          glutInitWindowPosition(600, 200);
          glutCreateWindow("OPenGL with C++");
          Initialize();
          while (a<=4){
          switch(a){
              case 1:
                    glutDisplayFunc(Vertikal);
                             glutMainLoop();
                              return 0;
             
              case 2:
                    glutDisplayFunc(Horizontal);
                             glutMainLoop();
                           return 0;
              case 3:
                    glutDisplayFunc(Diagonal);
                             glutMainLoop();
                           return 0;
              default:
                      cout<<"anda salah memasukan";
                      goto menu;
                      }}
             
                      }

Tidak ada komentar:

Posting Komentar