Anda di halaman 1dari 9

19 Maret

2013
Nama : Agus Setiawan
[100403020003]
Vicky Yanuwar Wiryawan
[100403020021]
Fakultas : Teknologi Informasi
Jurusan : Sistem Informasi
Mapel : Grafika Komputer

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

Algoritma DDA, Bresenham dan Midpoint 1


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


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. Tentukan 2 titik yang akan dihubungkan dalam pembentukan garis.

2. Tentukan salah satu titik disebelah kiri sebagai titik awal, yaitu (X0, Y0) dan
titik lainnya sebagai titik akhir (X1, Y1).

3. Hitung Dx=x2-x1, Dy=y2-y1, d1=2*DX dan d2=2*Dy - 2*Dx, e=d1-dx,


x=x1, y=y1

4. Gambar pixel di (x,y)

5. Untuk setiap e>=0 hitung e=e+d2 dan y=y+1 Jika tidak hitung e=e+d1
dan y=y

6. Hitung x=x+1

Algoritma DDA, Bresenham dan Midpoint 3


7. Jika x>=x2 stop, jika tidak kembali ke langkah 4
Langkah-langkah Algoritma Bresenheim (Dx<Dy):
1. Tentukan 2 titik yang akan dihubungkan dalam pembentukan garis.

2. Tentukan salah satu titik disebelah kiri sebagai titik awal, yaitu (X0, Y0) dan
titik lainnya sebagai titik akhir (X1, Y1)

3. Hitung Dx=x2-x1, Dy=y2-y1, d1=2*Dy dan d2=2*Dy - 2*Dx, e=d1-dy,


x=x1, y=y1

4. Gambar pixel di (x,y)

5. Untuk setiap e>=0 hitung e=e+d2 dan x=x+1 Jika tidak hitung e=e+d1
dan x=x

6. 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
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

Algoritma DDA, Bresenham dan Midpoint 4


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

Algoritma DDA, Bresenham dan Midpoint 5


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;

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

Algoritma DDA, Bresenham dan Midpoint 6


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. Tentukan radius r dengan titik pusat lingkarang(xc,yc) kemudian diperoleh
(x0,y0)=(0,r)
2. Hitung nilai dari parameter P0 = 5/4-r
3. 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. Tentukan titik simetris pada ketujuh oktan yang lain
5. 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;

procedure TMainFrm.GambarLingkaran (r:integer);


var
d1,d2:real; //d1= delta i d2= toh
xi,yi:integer;
mh,md,mv:integer;

Algoritma DDA, Bresenham dan Midpoint 7


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 8


Algoritma DDA, Bresenham dan Midpoint 9

Anda mungkin juga menyukai