Minggu, 03 April 2011

MEMBUAT GARIS DENGAN ALGORITMA BRESENHAM

ALGORITMA GARIS BRESENHAM
  • dikembangkan oleh Bresenham
  • berdasarkan selisih antara garis yang diinginkan terhadap setengah ukuran dari pixel yang sedang digunakan.
Bresenham pada tahun 1965, melakukan perbaikan dari algoritma perhitungan koordinat piksel yang menggunakan persamaan (1), dengan cara menggantikan operasi bilangan rii 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.

untuk menentukan jumlah pixel yang membuat suatu garis menggunakan algoritma bresenhem adalah sebagai berikut :

  1. Masukan 2 endpoints, simpan endpoints kiri sebagai (x0, y0) dan kanan (x1,y1)
  2. Hitung konstanta Δx, Δy, 2Δy, 2Dx,2Δy–2Δx dan nilai awal parameter keputusan p0= 2Δy –Δx
  3. Pada setiap xk di garis, dimulai dari k=0, ujilah : Jika pk 0 maka plot (xk+1, yk+1) dan pk= pk+ 2Δy -2Δx
  4. Ulangi tahap 4 sampai mencapai x,y yang di tuju.
Contoh :
Hitunglah posisi piksel hingga membentuk sebuah garis yang menghubungkan titik (4,1) dan (14,8) !
  • Menentukan endpoints (x0,y0)= (4,1) dan (x1,y1)=(14,8)
  • Hitung kostanta :
Dx = x1-x0 Dx= 14-4=10
Dy= y1-y0 Dy= 8-1=7
2Dx= 2.10=20
2Dy= 2.7=14
2Dy-2Dx= 14-20= -6
pk=p0= 2Dy-Dx pk=p0= 14-10=4

  • jadi nilai keputusan awal= 4, karena pk=4 maka kita gunakan pk>0 maka plot (xk+1,yk+1) = (4+1,1+1) = (5,2) adalah plot yang terbentuk pada K=0. dan kita hitung nilai keputusan untuk plot selanjutnya. Dengan rumus pk= pk+ 2Δy -2Δx pk=4+(-6)=-2 adalah nilai keputusan yang ke 2. karena pk=-2 kita gunakan rumus pk<0 k="1.">>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; }} }

Running Program.

Membuat Garis Vertikal



Membuat Garis Horizontal



Tidak ada komentar:

Posting Komentar