Anda di halaman 1dari 8

19 Maret 2013 Nama : Agus Setiawan Vicky Yanuwar Wiryawan Fakultas Jurusan Mapel : Teknologi Informasi : Sistem Informasi

: Grafika Komputer [100403020003] [100403020021]

1. Algoritma DDA Algoritma DDA bekerja bekerja atas dasar penambahan nilai x dan nilai y. Pada garis lurus, turunan pertama dari x dan y adalah konstanta. Sehingga untuk memperoleh suatu tampilan dengan ketelitian tinggi, suatu garis dapat dibangkitkan dengan menambah nilai x dan y masing-masing sebesar ex dan ey, dengan besaran dengan nilai yang sangat kecil. Kondisi ideal ini sukar dicapai, karenanya pendekatan yang mungkin dilakukan adalah berdasarkan piksel-piksel yang bisa dialamati/dicapai atau melalui penambahan atau pengurangan nilai x dan y dengan suatu besaran dan membulatkannya ke nilai integer terdekat. Langkah-langkah 1. Tentukan 2 buah titik. 2. Tentukan yang menjadi titik awal (X0,Y0) dan titik akhir (X1,Y1). 3. Hitung Dx dan Dy. Dx = X1-X0 dan Dy = Y1 Y0

4. Bandingkan Abs(Dx) dan Abs(Dy). Jika Abs(Dx) > Abs(Dy) maka Steps = Abs(Dx) bila tidak Steps = Abs(Dy) 5. Hitung penambahan koordinat pixel, yaitu:X_increment = dx/steps, danY_increment = dy/steps. 6. Koordint selanjutnya, yaitu X+X_increment Y+Y_increment 7. Posisi pixel ditentukan dengan pembulatan nilai koordinat tersebut. 8. Ulangi langkah 6 dan 7 untuk posisi selanjutnya sampai X = X1, Y = Y1 Penerapan Menggunakan Delphi
procedure TMainFrm.DDA (x1,y1,x2,y2:integer;grid:Boolean); var step,m,x,y:real; Begin m := (y2-y1) / (x2-x1); if (m > 0) and (m < 1) then begin y:=y1; step := m; x:=x1; while x <= x2 do

Algoritma DDA, Bresenham dan Midpoint

begin if grid then PutPixelGrid(round(x),round(y)) else PutPixel(round(x),round(y),clBlack); y:=y + step; x:=x+1; end; end else if m > 1 then begin x:=x1; step := 1/m; y:=y1; while y <= y2 do begin if grid then PutPixelGrid(round(x),round(y)) else PutPixel(round(x),round(y),clBlack); x:= x + step; y:= y + 1; end; end else if m = 1 then begin x:=x1; y:=y1; while x <= x2 do begin if grid then PutPixelGrid(round(x),round(y)) else PutPixel(round(x),round(y),clBlack); x:=x+1; y:=y+1; end; end; end;

Algoritma DDA, Bresenham dan Midpoint

2. Algoritma Bresenham Tujuan dari algoritma Bressenham ini adalah untuk menghindari pembulatan nilai seperti pada algoritma DDA. 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. Langkah-langkah Algoritma Bresenheim (Dx>Dy):
1. 2.

Tentukan 2 titik yang akan dihubungkan dalam pembentukan garis. Tentukan salah satu titik disebelah kiri sebagai titik awal, yaitu (X0, Y0) dan titik lainnya sebagai titik akhir (X1, Y1).

3. 4. 5. 6. 7.

Hitung Dx=x2-x1, Dy=y2-y1, d1=2*DX dan d2=2*Dy - 2*Dx, e=d1-dx, x=x1, y=y1 Gambar pixel di (x,y) Untuk setiap e>=0 hitung e=e+d2 dan y=y+1 Jika tidak hitung e=e+d1 dan y=y Hitung x=x+1 Jika x>=x2 stop, jika tidak kembali ke langkah 4

Langkah-langkah Algoritma Bresenheim (Dx<Dy):


1. 2.

Tentukan 2 titik yang akan dihubungkan dalam pembentukan garis. Tentukan salah satu titik disebelah kiri sebagai titik awal, yaitu (X0, Y0) dan titik lainnya sebagai titik akhir (X1, Y1)

3. 4. 5. 6.

Hitung Dx=x2-x1, Dy=y2-y1, d1=2*Dy dan d2=2*Dy - 2*Dx, e=d1-dy, x=x1, y=y1 Gambar pixel di (x,y) Untuk setiap e>=0 hitung e=e+d2 dan x=x+1 Jika tidak hitung e=e+d1 dan x=x Hitung y=y+1. Jika y>=y2 stop, jika tidak kembali ke langkah 4

Penerapan Menggunakan Delphi


procedure TMainFrm.Bresenham (x1,y1,x2,y2:integer;grid:Boolean); var p,d1,d2,i,x,y,dx,dy,stop,signx,signy : integer; e : integer; s,signx_s,signy_s : string; finish:boolean; begin //asumsikan berada di kuadran 1 signx:=1; signy:=1; s:='Kuadran I'; if (x1 > x2 ) and (y1 < y2) then //test apakah garis ini berada di kuadran 2

Algoritma DDA, Bresenham dan Midpoint

begin s:='Kuadran II'; signx:=-1; signy:=1; end else if (x1 > x2 ) and (y1 > y2) then //test apakah garis ini ada di kuadran 3 begin s:='Kuadran III'; swap(x1,x2); swap(y1,y2); signx:=-1; signy:=-1; end else if (x1 < x2) and (y1 > y2) then //test apakah garis ini ada kuadran 4 begin //ubah menjadi kuadran 2 swap(x1,x2); swap(y1,y2); signx:=-1; signy:=1; s:='Kuadran IV'; end; if signx = 1 then signx_s:='+' else signx_s:='-'; if signy = 1 then signy_s:='+' else signy_s:='-'; x:= x1; y:= y1; dx := abs (x2 - x1); dy := abs (y2 - y1); if dx > dy then begin d1:=2 * dy; d2:=2 * (dy - dx); e := 2* dy - dx; stop:=dx; end else begin d1:=2 *dx; d2:=2 *(dx-dy); e := d1 - dy; stop:=dy; end; i:=1; finish:=false; while not Finish do begin if grid then PutPixelGrid(round(x),round(y)) else

Algoritma DDA, Bresenham dan Midpoint

PutPixel (round(x),round(y),clRED); if dx > dy then //cenderung mendatar begin if e < 0 then begin e := e + (2 * dy); end else begin y := y + (signy * 1); e := e + 2 * (dy - dx); end; x := x + (signx * 1); if x >= x2 then begin finish:=True; end; end else //cenderung tegak begin if e < 0 then begin e := e + (2 * dx); end else begin x:= x + (signx * 1); e:= e + 2 * (dx - dy); end; y := y + (signy * 1); if y >= y2 then begin finish:=True; end; end; end; //while x < x2 end;

Algoritma DDA, Bresenham dan Midpoint

3. Algoritma Midpoint Algoritma Lingkaran Midpoint juga disebut algoritma lingkaran Bressenham. Bressenham mengembangkan generator lingkaran yang cukup efisien. Algoritma yang digunakan membentuk semua titik berdasarkan titik pusat dengan penambahan semua jalur sekeliling lingkaran. Algoritma ini diturunkan dari algoritma Midpoint untuk pembentukan garis. Dalam hal ini hanya diperhatikan bagian 45 dari suatu lingkaran, yaitu oktan kedua dari x=0 ke x=R/2, dan menggunakan CirclePoints untuk menampilkan titik dari seluruh lingkaran. Langkah langkah untuk membentuk lingkaran algoritma Circle Midpoint:
1. 2. 3.

Tentukan radius r dengan titik pusat lingkarang(xc,yc) kemudian diperoleh (x0,y0)=(0,r) Hitung nilai dari parameter P0 = 5/4-r Tentukan nilai awak k=0 untuk setiap posisi xk berlaku sebagai berikut: Bila Pi<0, maka titik selanjutnya adalah (xk+i,yk) dan Pk+i=Pk+2xk+i+1 Bila tidak, maka selanjutnya adalah (Xk+1, Yk-1), dan Pk+1 = Pk+2xk+1+1-2yk+1 Dimana 2xk+1 = 2xk+2 dan 2yk+ = 2yk-2

4. 5.

Tentukan titik simetris pada ketujuh oktan yang lain Gerakkan setiap posisi pixel(x,y) pada garis melingkar dari lingkaran dengan titik pusat (xc,yc) dan tentukan nilai koordinat: x=x+xc y=y+yc

6.

Ulangi langkah ke-3 sampai 5, sehingga x>=y

Penerapan Menggunakan Delphi


procedure TMainFrm.GambarTitik(xi,yi:integer); var x,y:integer; begin x:=xcenter+xi; y:=ycenter-yi; //kuadran 1 Canvas.Pixels[x,y]:=clred; //jika ingin menggambar penuh maka ubah titik ke kuadran ii, iii, dan iv if LingkaranPenuhCheck.Checked then begin x:=xcenter-xi; y:=ycenter-yi; //kuadran 2 Canvas.Pixels[x,y]:=clred; x:=xcenter-xi; y:=ycenter+yi; //kuadran 3 Canvas.Pixels[x,y]:=clred; x:=xcenter+xi; y:=ycenter+yi; //kuadran 4 Canvas.Pixels[x,y]:=clred; end; end;

Algoritma DDA, Bresenham dan Midpoint

procedure TMainFrm.GambarLingkaran (r:integer); var d1,d2:real; //d1= delta i d2= toh xi,yi:integer; mh,md,mv:integer; begin xi:=0; yi:=R; while yi > 0 do begin GambarTitik(xi,yi); md:=abs(sqr(xi+1)+sqr(yi-1)-sqr(r)); mh:=abs(sqr(xi+1)+sqr(yi) - sqr(r)); mv:=abs(sqr(xi)+sqr(yi-1) - sqr(r)); d1:=sqr(xi+1) + sqr(yi-1) - sqr(r); if d1 < 0 then //cek apakah memilih D atau H begin d2:=mh-md; //cek apakah akan memilih H atau D if d2 <= 0 then begin xi:=xi+1; //pilih titik H yi:=yi; end else begin xi:=xi+1; //pilih titik D yi:=yi-1; end; end else if d1 > 0 then begin d2:=mv - md; //cek apakah akan memilih V atau D if d2 <= 0 then begin xi:=xi; yi:=yi-1; end else begin xi:=xi+1; yi:=yi-1; end; end else if d1 = 0 then begin xi:=xi+1; //memilih D yi:=yi-1; end; end; end; procedure TMainFrm.GambarBtnClick(Sender: TObject); begin Canvas.FillRect(Rect(0,Panel1.Height,Width,Height)); xcenter:=Width div 2; ycenter:=(Height - Panel1.Height) div 2; GambarLingkaran(StrToInt(EJari.Text)); end;

Algoritma DDA, Bresenham dan Midpoint

Algoritma DDA, Bresenham dan Midpoint

Anda mungkin juga menyukai