• Tidak ada hasil yang ditemukan

BAB-3 ATRIBUT PRIMITIF 2D

N/A
N/A
Protected

Academic year: 2021

Membagikan "BAB-3 ATRIBUT PRIMITIF 2D"

Copied!
13
0
0

Teks penuh

(1)

BAB-3

ATRIBUT PRIMITIF 2D

Yang termasuk dalam atribut primitive adalah titik dan garis.

Pembetuk garis yang dikenal adalah algoritma DDA, dan Bresenham.

Oleh : I Gusti Ngurah Suryantara,S.Kom., M.Kom

3.1. PENDAHULUAN

Yang merupakan atribut primitif adalah: titik dan garis. Ada beberapa metode pembentuk

garis yang umum digunakan yaitu:



Algoritma DDA (Digital Defferential Analyzer)



Algoritma Bressenham

3.1.1. DDA (Digital Defferential Analyzer)

Garis merupakan kumpulan dari titik-titik, untuk membentuk garis lurus adalah dengan

mengetahui titik awal dan titik akhir. Dengan mengetahui titik awal dan titik akhir maka kita

dapat membentuk garis. Untuk menggambarkan proses pembuatan garis dari titik awal ke titik

akhir ada berbagai algoritma. Algoritma yang umum adalah DDA dan Bresenham.

Berikur ini adalah algoritma DDA

1.

Tentukan 2 buah titik.

2.

Tentukan yang menjadi titik awal (X

0

,Y

0

) dan titik akhir (X

1

,Y

1

).

3.

Hitung Dx dan D

y

D

x

= X

1

-X

0

dan

D

y

= Y

1

– Y

0

4.

Bandingkan Abs(D

x

) dan Abs(D

y

)

Jika Abs(D

x

) > Abs(D

y

) maka

Steps = Abs(D

x

) bila tidak Steps = Abs(D

y

)

5.

Hitung penambahan koordinat pixel, yaitu:

X_increment = dx/steps, dan

Y_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 = X

1

, Y = Y

1

(2)

DDA (bahasa pascal)

Procedure DDA;

Begin

Write(‘Masukkan Nilai X0 : ‘);

Readln(X0);

Write(‘Masukkan Nilai Y0 : ‘);

Readln(Y0);

Write(‘Masukkan Nilai X1 : ‘);

Readln(X1);

Write(‘Masukkan Nilai Y1 : ‘);

Readln(Y1);

Dx:= X1-X0;

Dy:= Y1-Y0;

If Abs(Dx) > Abs(Dy) Then

Steps:= Abs(Dx)

Else

Steps:= Abs(Dy);

Endif

Xincrement = dx / Steps

Yincrement = dy / Steps

PutPixel(x,y,Hitam);

For x = 1 to Steps Do

X := X + Xincrement;

Y := Y + Yincrement;

PutPixel(x,y,Hitam);

End;

End;

Contoh

Diketahui 2 buah titik A(10,10) dan titik B(17,16), bila titik A sebagai titik awal dan titik B

sebagai titik akhir maka buatlah garis yang menghubungkan titik tersebut dengan

menggunakan algoritma DDA.

Jawab

Titik Awal = A(10,10)

Titik Akhir = B(17,16)

D

x

= (X

1

-X

0

)

(17-10) = 7

D

y

= (Y

1

-Y

0

)

(16-10) = 6

Abs(D

x

) = Abs(7) = 7

Abs(D

y

) = Abs(6) = 6

Abs(D

x

) > Abs(D

y

) maka Step = Abs(D

x

) = 7

Xincrement = Dx / Step

= 7 / 7 = 1

Yincrement = Dy / Step

= 6 / 7 = 0,86

(3)

K

X

Y

Xinc Yinc

-

-

-

10

10

0

11

10,86

11

11

1

12

11,71

12

12

2

13

12,57

13

13

3

14

13,43

14

14

4

15

14,28

15

14

5

16

15,14

16

15

6

17

16

17

16

Y

16 B(17,16)

10 A(10,10)

10 17

X

Gambar 3.1. Digambar pada sumbu cartesian

Digambar Pada Layar Monitor

x

y

Gambar 3.2. Coordinat monitor

(4)

Gambar 3.3. Tampilan DDA dengan VB

4.1.2.BRESSENHAM

ALGORITMA BRESSENHAM

Tujuan dari algoritma Bressenham ini adalah untuk menghindari pembulatan nilai seperti

pada algoritma DDA.

1.

Tentukan dua titik yang akan dihubungkan dalam pembentukan garis.

2.

Tentukan salah satu titik di sebelah kiri sebagai titi awal, yaitu (x

0

,y

0

) dan titik lainnya

sebgai titik akhir (x

1

,y

1

).

3.

Hitung d

x

,d

y

,2

dx

dan 2

dy

-2

dx

.

4.

Hitung parameter P

0

= 2

dy

-d

x

5.

Untuk setiap X

k

sepanjang jalur garis, dimulai dengan k=0,

-

bila p

k

<0, maka titik selanjutnya adalah (x

k

+1, y

k

), dan P

k+1

= P

k

+2

dy

-

bila tidak, maka titik selanjutnya adalah (x

k

+1,y

k

+1), dan P

k+1

= P

k

+2

dy

-2

dx

6.

Ulangi langkah no 5 untuk menentukan posisi pixel selanjutnya,

sampai x = x

1

dan y = y

1

.

(5)

Sub Rutim Berssenham dalam C

Void line (int xa, ya, xb, yb, xEnd; flot x,y)

{

Int dx = abs(xb-xa), dy=abs(yb-ya);

Int p = 2*dy-dx;

Int twoDy = 2*dy, twodyDx = 2*(dy-dx);

If (xa>xb) {

X = xb;

Y = yb;

Xend = xa;

}

Else{

X = xa;

Y = ya;

xEnd = xb;

}

SetPixel(x,y);

While (x<xEnd) {

X=X+1;

If (p<0)

P = P + twody;

Else{

Y = Y + 1;

P = P + twoDyDx;

}

SetPixel(x,y);

}

};

Contoh

Berdasarkan contoh pada algoritma DDA buatlah dengan metode bresenham.

JAWAB

dx = abs(xb – xa)

= abs(17 – 10 ) = 7

dy = abs(yb – ya)

= abs(16 – 10) = 6

p

= 2 * dy - dx

= 2 * 6 – 7 = 5

twody

= 2 * dy

= 2 * 6 = 12

twodydx

= 2 * (dy – dx )

= 2 * ( 6 – 7 ) = -2

Periksa xa dan xb

xa = 10 < xb = 17

Maka

(6)

x

= xa

= 10

y

= ya

= 10

Xend = xa

= 17

Ulangi selama x < xend

K0: x = x + 1

= 10 + 1 = 11

Periksa nilai p , dimana p = 5

y = y + 1

= 10 + 1 = 11

p = p + twodydx

= 5 + (-2) = 3

K1: x = x + 1

= 11 + 1 = 12

Periksa nilai p, dimana p = 3

y = y +1

= 11 + 1 = 12

p = p + twodydx

= 3 + (-2) = 1

K2: x = x + 1

= 12 + 1 = 13

Periksa nilai p, dimana p = 1

y = y +1

= 12 + 1 = 13

p = p + twodydx

= 1 + (-2) = -1

K3: x = x + 1

= 13 + 1 = 14

Periksa nilai p, dimana p = -1

Nilai y tetap yaitu y=13

p = p + twody

= (-1) + 12 = 11

K4: x = x + 1

= 14 + 1 = 15

(7)

y = y +1

= 13 + 1 = 14

p = p + twodydx

= 11 + (-2) = 9

K5: x = x + 1

= 15 + 1 = 16

Periksa nilai p, dimana p = 9

y = y +1

= 14 + 1 = 15

p = p + twodydx

= 9 + (-2) = 7

K6: x = x + 1

= 16 + 1 = 17

Periksa nilai p, dimana p = 7

y = y +1

= 15 + 1 = 16

p = p + twodydx

= 7 + (-2) = 5

Proses berhenti karena x = x

1

dan y = y

1

Masukkan nilai kedalam tabel, seperti pada tabel 3.2.

Tabel 3.2.Hasil penelusuran dengan bressenham

K

P

k

(X

k+1

, Y

k+1

)

-

-

10,10

0

3

11,11

1

1

12,12

2

-1

13,13

3

11

14,13

4

9

15,14

5

7

16,15

6

5

17,16

(8)

Y

Digambar pada sumbu cartesian

16 B(17,16)

10 A(10,10)

10 17

x

Gambar 3.4. Hasil perhitungan dengan bressenham

Latihan

Diketahui 2 buah titik yaitu, A(25,27) dan B(20,17), buatlah garis dengan menggunakan

algoritma DDA dan Bressenham.

PRAKTIKUM

Latihan Praktikum 1

Pada latihan kali ini kita akan membuat program pembentuk garis dengan menggunakan

algoritma DDA. Desain sebuah form seperti pada Gambar 3.5.

Contoh program garis DDA dengan VB

(9)

Setting Property

Objek

Properti

Setting

Form1

Nama

Caption

FrmDDA

AlgoritmaDDA

Frame1

Name

Caption

Frame1

Bidang Gambar

Frame2

Name

Caption

Frame2

Titik Awal

Frame3

Name

Caption

Frame3

Titik Akhir

PictureBox1

Name

ScaleMode

PicBidangGambar

Pixel

Label1

Name

Caption

Label1

X0

Label2

Name

Caption

Label2

Y0

TextBox1

Name

Text

TxtX0

TextBox2

Name

Text

TxtY0

Label3

Name

Caption

Label3

X1

Label4

Name

Caption

Label4

Y1

TextBox3

Name

Text

TxtX1

TextBox4

Name

Text

TxtY1

Label5

Name

Caption

Label5

X_Inc , Y_Inc

ListBox1

Name

ListData

CommandButton1 Name

Capton

cmdOk

&Ok

CommandButton2 Name

Caption

cmdCancel

&Cancel

Buat Modul

Buat sebuah modul dengan nama module1

Option Explicit

Public SzeX As Long, SzeY As Long Public PSzeX As Long, PSzeY As Long Public PixSze As Long

Public ShowGrid As Boolean Public PenWidth As Long Type POINTAPI

X As Long Y As Long End Type

(10)

Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long

Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long

Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long

Public Sub APIline(hdc As Long, PenType As Long, BorderW As Long, BorderKl As Long, _ iX1 As Long, iY1 As Long, iX2 As Long, iY2 As Long)

Dim Pt As POINTAPI

Dim hPn As Long, hPnOld As Long

hPn = CreatePen(PenType, BorderW, BorderKl Xor &H1000000) hPnOld = SelectObject(hdc, hPn)

MoveToEx hdc, iX1, iY1, Pt LineTo hdc, iX2, iY2 SelectObject hdc, hPnOld DeleteObject hPn End Sub

Public Sub APIrect(hdc As Long, BorderW As Long, BorderKl As Long, FillKl As Long, _ iX1 As Long, iY1 As Long, iX2 As Long, iY2 As Long)

Dim hPn As Long, hPnOld As Long Dim hBr As Long, hBrOld As Long

hPn = CreatePen(0, BorderW, BorderKl Xor &H1000000) hPnOld = SelectObject(hdc, hPn)

hBr = CreateSolidBrush(FillKl Xor &H1000000) hBrOld = SelectObject(hdc, hBr)

Rectangle hdc, iX1, iY1, iX2, iY2 SelectObject hdc, hBrOld DeleteObject hBr SelectObject hdc, hPnOld DeleteObject hPn End Sub

Program garis DDA

Option Explicit

Dim Loading As Boolean

Dim CurCol As Long ' current color = pallet ID Dim prSzeX As Long

Dim prSzeY As Long

Private Sub GambarPixel(X As Long, Y As Long, Color As Long) Dim eX1 As Long, eY1 As Long

Dim eX2 As Long, eY2 As Long

If PenWidth = 1 Then eX1 = X * PixSze eY1 = Y * PixSze eX2 = (X + 1) * PixSze

(11)

eY2 = (Y + 1) * PixSze

APIrect BidangGambar.hdc, 0, 8, Color, eX1, eY1, eX2, eY2 Else

eX1 = (X - PenWidth \ 2) * PixSze eY1 = (Y - PenWidth \ 2) * PixSze If PenWidth = 3 Or PenWidth = 5 Then eX2 = (X + PenWidth \ 2 + 1) * PixSze eY2 = (Y + PenWidth \ 2 + 1) * PixSze Else

eX2 = (X + PenWidth \ 2) * PixSze eY2 = (Y + PenWidth \ 2) * PixSze End If

APIrect BidangGambar.hdc, 0, Color, Color, eX1, eY1, eX2, eY2 End If

BidangGambar.Refresh End Sub

'membuat grid lines Private Sub GambarGrid() Dim I As Long

Dim J As Long For I = 0 To SzeY - 1

APIline BidangGambar.hdc, 0, 0, 8, 0, I * PixSze, SzeX * PixSze, I * PixSze Next I

For I = 0 To SzeX - 1 For J = 5 To SzeX Step 5

BidangGambar.ForeColor = vbRed

APIline BidangGambar.hdc, 0, 0, vbBlue, J * PixSze, 0, J * PixSze, SzeY * PixSze Next J

APIline BidangGambar.hdc, 0, 0, 8, I * PixSze, 0, I * PixSze, SzeY * PixSze Next I

For J = 5 To SzeY Step 5

BidangGambar.ForeColor = vbRed

APIline BidangGambar.hdc, 0, 1, vbGreen, 0, J * PixSze, SzeX * PixSze, J * PixSze Next J

End Sub

'menampilkan grid lines pada bidang gamar Private Sub PixelKecilKeBesar()

If ShowGrid Then GambarGrid BidangGambar.Refresh End Sub

Private Sub cmdGambar_Click() Dim dX, dY, k As Integer

Dim XIncrement, YIncrement, X, Y As Variant Dim Steps As Single

'Bersihkan bidang gambar BidangGambar.Cls PixelKecilKeBesar ListView1.ListItems.Clear Loading = False

PenWidth = Val(scrollTebalGaris.Value) 'atur ketebalan garis

(12)

dX = Val(txtX1.Text) - Val(txtX0.Text) dY = Val(txtY1.Text) - Val(txtY0.Text)

'Cari nilai steps

If Abs(dX) > Abs(dY) Then Steps = Abs(dX) Else

Steps = Abs(dY) End If

'Hitung XIncrement dan YIncrement XIncrement = dX / Steps YIncrement = dY / Steps X = Val(txtX0.Text) Y = Val(txtX0.Text)

'Hidupkan pixel pada posisi x,y

GambarPixel Round(X), Round(Y), CurCol ListView1.ListItems.Add , , "-" ListView1.ListItems(ListView1.ListItems.Count).SubItems(1) = "-" ListView1.ListItems(ListView1.ListItems.Count).SubItems(2) = "-" ListView1.ListItems(ListView1.ListItems.Count).SubItems(3) = Round(X) ListView1.ListItems(ListView1.ListItems.Count).SubItems(4) = Round(Y) For k = 1 To Steps X = X + XIncrement Y = Y + YIncrement

'Hidupkan pixel pada posisi x + xIncremen,y + yIncrement GambarPixel Round(X), Round(Y), CurCol

ListView1.ListItems.Add , , k ListView1.ListItems(ListView1.ListItems.Count).SubItems(1) = X ListView1.ListItems(ListView1.ListItems.Count).SubItems(2) = Y ListView1.ListItems(ListView1.ListItems.Count).SubItems(3) = Round(X) ListView1.ListItems(ListView1.ListItems.Count).SubItems(4) = Round(Y) Next k End Sub

Private Sub cmdKeluar_Click() Unload Me

End Sub

Private Sub Form_Activate() If Loading = True Then PixelKecilKeBesar Loading = False End If

End Sub

Private Sub Form_Load() 'Menampilkan data di list view

Call ListView1.ColumnHeaders.Add(, , "k", 300) Call ListView1.ColumnHeaders.Add(, , "X", 700) Call ListView1.ColumnHeaders.Add(, , "Y", 700) Call ListView1.ColumnHeaders.Add(, , "Xk+1", 600) Call ListView1.ColumnHeaders.Add(, , "Yk+1", 600) ListView1.ListItems.Clear

(13)

PixSze = 8

SzeX = 128: SzeY = 64: prSzeX = 127: prSzeY = 63 PSzeX = 8: PSzeY = 8

ShowGrid = True

PenWidth = 1 'atur ketebalan garis End Sub

'Untuk mendapatkan nilai posisi kursor di koordinat x,y

Private Sub BidangGambar_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) lblX.Caption = (X \ PixSze)

lblY.Caption = (Y \ PixSze) End Sub

Private Sub scrollTebalGaris_Change()

TebalGaris.BorderWidth = scrollTebalGaris.Value End Sub

End Sub

Tugas Buatlah Program pembentuk garis menggunakan algoritma

Bresenham.

Gambar

Tabel 3.1. Nilai perhitungan
Gambar 3.1. Digambar pada sumbu cartesian
Gambar 3.3. Tampilan DDA dengan VB
Tabel 3.2.Hasil penelusuran dengan bressenham
+2

Referensi

Dokumen terkait

Menambah pengetahuan mahasiswa tentang perkembangan perawatan tradisional untuk mengatasi masalah ketombe pada kulit kepala dengan menggunakan bahan alami yaitu minyak

Ruang lingkup penelitian ini meliputi lingkup bidang kajian dan lingkup bidang ilmu, yaitu lingkup bidang kajian adalah tanggung jawab pelaku usaha yaitu Ivan bronies

Untuk tekanan darah sistolik hasil uji statistik yang dilakukan dengan mengunakan uji Rank Spearman diperoleh nilai p sebesar 0,346 (p&gt;0,05), maka H0 diterima

Hasil dari penelitian ini bahwa berkas keberatan atas Pajak Penghasilan Badan di Kanwil DJP Jakarta Khusus dapat diselesaikan sebelum jatuh tempo penyelesaian

Orang Gowa lalu berkata, “K alau Pangeran Banten tidak mau memberikan kita mayat Tuanta, bagaimana pendapatmu .” Mereka lalu bermufakat bahwa lebih baik mati,

Louis(Polisi) juga tinggal di sini. Sekitar rumah Gotz terdapat banyak kayu untuk kamu tebang. Hot Spring: Spa yang berada di lingkungan luar. Ketika karaktermu mulai lelah, habiskan

Pada umumnya, manajer berusaha untuk menemukan cara dalam mengelola baik laba yang dilaporkan di laporan keuangan dan laba untuk pembayaran pajak berjalannya dalam

Unit analisis dalam penelitian adalah pengakuan pendapatan PDAM dan kewajiban pajak penghasilan yang meliputi perhitungan, penyetoran dan pelaporan pajak