Kamis, 05 Maret 2009

TITIK DAN GARIS

Tanggal 27 februari merupakan hari dimana praktikum grafika season 2 dimulai dengan asdos tetep maz rizahilmi.. dengan judul materi TITIK DAN GARIS ... dlam praktikum ini kita dituntut untuk memahami algoritma pembentukan garis dengan Bressenham dan DDA. Dan kemudian mengaplikasikan algoritma tersebut ke dalam program.

Teori yang di bahas di dalam praktikum meliputi :

1.

y = mx + b

PERSAMAAN GARIS

Persamaan garis menurut koordinat Cartesian adalah

dimana m adalah slope/kemiringan garis yang dibentuk dari dua titik, yaitu (x1,y1) dan (x2,y2).Untuk penambahan x sepanjang garis yaitu dx akan mendapatkan penambahan y sebesar : dy = m . dx

2. ATRIBUT

Atribut dasar untuk garis lurus adalah type (tipe), width (tebal) dan color (warna).

3. TIPE GARIS

Garis mempunyai beberapa linetype (tipe garis) diantaranya solid line (garis tebal), dashed line (garis putus), dan dotted line (garis titik-titik).

4. ALGORITMA PEMBENTUKAN GARIS

Algoritma pembentukan garis menggunakan 3 algoritma :

  1. ALGORITMA GARIS DDA

Digital Diferensial Analyser (DDA) adalah algoritma pembentukan garis berdasarkan perhitungan dx maupun dy, menggunakan rumus dy = m . dx. Garis dibuat menggunakan dua endpoint, yaitu titik awal dan titik akhir. Setiap koordinat titik yang membentuk garis diperoleh dari perhitungan, kemudian dikonversikan menjadi nilai integer.

Langkah-langkah membentuk garis menurut algoritma DDA adalah :

a. Tentukan dua titik yang akan dihubungkan dalam pembentukan garis

b. Tentukan titik awal yaitu dan titik akhir .

c. Hitung dx = x1- x0 dan dy = y1 y0

d. Tentukan step = max( |dx| , |dy| )

e. Hitung penambahan koordinat pixel XInc = dx / step dan YInc = dy / step

f. Koordinat selanjutnya (x+XInc, y+yInc)

g. Posisi pada layar ditentukan dengan pembulatan nilai koordinat tersebut

  1. Ulangi nomor 6 dan 7 untuk menentukan posisi pixel berikutnya. sampai x=x1 dan y=y1.

Contoh Program Pembentukan Garis DDA

Diketahui dua titik untuk membentuk garis yaitu titik A(10,10) dan B(17,16).

· Buat table perhitungan untuk titik-titik yang dihasilkan oleh algoritma DDA.

· Buat program untuk mengimplementasikannya !

Jawab :

· Tabel perhitungan

Urutan langkah-langkah agoritma DDA :

a. A(10,10) dan B(17,16)

b. =(10,10) dan =(17,16)

c. à à

d. à à

e. ()>() maka step = 7

f. XInc = dx / step à XInc = 7 / 7 à XInc = 1

g. YInc = dy / step à YInc = 6 / 7 à YInc = 0,86

h. (x+XInc, y+yInc) = (10+1, 10+0,86)= (11, 10,86)

i. Dibulatkan à(11,11)

Ulangi langkah 5 dan 6 sampai 7 kali langkah. Akan didapat table :

k

x

Y

0

1

2

3

4

5

6

10

11

12

13

14

15

16

17

10

10,86

11,71

12,57

13,43

14,29

15,14

16

(10,10)

(11,11)

(12,12)

(13,13)

(14,13)

(15,14)

(16,15)

(17,16)

· Program

Untuk proses pengkodean pembentukan garis DDA diperlukan fungsi utama yaitu dan beberapa fungsi lain untuk inisialisasi dan tampilan.

script dari fungsi pembentukan garis DDA:


Program Unit1.cpp

//---------------------------------------------------------------------------

#include

#pragma hdrstop

#include

#include

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int X1,X2,Y1,Y2;

int tergambar;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormActivate(TObject *Sender)

{

Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::DDA(int xa,int ya,int xb,int yb)

{

int dx,dy,step,k;

float Xincrement,Yincrement,x,y;

xa=20; ya=10; xb=100; yb=100;

dx= xb-xa;

dy= yb-ya;

x= (float)xa;

y= (float)ya;

if (abs(dx)>abs(dy))

{ step= (abs(dy)); }

else

{ step= (abs(dx)); }

Xincrement=(float)dx/step;

Yincrement=(float)dx/step;

Image1->Canvas->Pixels[int (x)][int (y)]=clBlack;

judul(x,y);

for (k=0;k<=step;k++)

{

x+=Xincrement;

y+=Yincrement;

Image1->Canvas->Pixels[int(x)][int (y)]=clBlack;

tampil(x,y,k);

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

tergambar=true; X1=X; Y1=Y;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

{

BtBaruClick(Sender);

tergambar=false; //semua yang ditampilkan dihilangkan

X2=X; Y2=Y;

if (RadioGroup1->ItemIndex==0)

{DDA(X1,Y1,X2,Y2);

}

};

}

//---------------------------------------------------------------------------

void __fastcall TForm1::BtBaruClick(TObject *Sender)

{

tergambar=false;

Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);

} //perhitungan mulai dari awal

void __fastcall TForm1::judul(float x,float y)

{

char tampilX[20],tampilY[20];

int xt=200, yt=15, kt=2;

_gcvt(x,4,tampilX);

_gcvt(y,4,tampilY);

Image1->Canvas->TextOut(xt-50, (kt-1)*yt, "k") ;

Image1->Canvas->TextOut(xt, (kt-1)*yt, "x") ;

Image1->Canvas->TextOut(xt+50, (kt-1)*yt, "y") ;

Image1->Canvas->TextOut(xt, kt*yt, tampilX) ;

Image1->Canvas->TextOut(xt+50, kt*yt, tampilY) ;

Image1->Canvas->TextOut(xt+100, (kt-1)*yt, "(x bulat, y bulat)") ;

_gcvt(x,2,tampilX);

_gcvt(y,2,tampilY);

//Menampilkan koordinat X dan Y

Image1->Canvas->TextOut(xt+100, kt*yt,"(");

Image1->Canvas->TextOut(xt+120, kt*yt,tampilX);

Image1->Canvas->TextOut(xt+150, kt*yt,",");

Image1->Canvas->TextOut(xt+160, kt*yt,tampilY);

Image1->Canvas->TextOut(xt+190, kt*yt,")");

}

//===================================================================

void __fastcall TForm1::tampil(float x,float y,int k)

{

char tampilX[20],tampilY[20],tampilK[20];

int xt=200, yt=15;

k += 3;

//Menampilkan bilangan asli tanpa pembulatan

_gcvt(x,4,tampilX);

_gcvt(y,4,tampilY);

Image1->Canvas->TextOut(xt, k*yt,tampilX);

Image1->Canvas->TextOut(xt+50, k*yt,tampilY);

//Menampilkan bilangan yang digunakan untuk pembulatan

_gcvt(x,2,tampilX);

_gcvt(y,2,tampilY);

_gcvt(k-3,10,tampilK);

//Menampilkan koordinat X dan Y

Image1->Canvas->TextOut(xt-50, k*yt,tampilK);

Image1->Canvas->TextOut(xt+100, k*yt,"(");

Image1->Canvas->TextOut(xt+120, k*yt,tampilX);

Image1->Canvas->TextOut(xt+150, k*yt,",");

Image1->Canvas->TextOut(xt+160, k*yt,tampilY);

Image1->Canvas->TextOut(xt+190, k*yt,")");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Close();

}

Program Unit1.h

//---------------------------------------------------------------------------

#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include

#include

#include

#include

#include

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TImage *Image1;

TRadioGroup *RadioGroup1;

TButton *BtBaru;

TButton *Button2;

void __fastcall FormActivate(TObject *Sender);

void __fastcall DDA(int xa,int ya,int xb,int yb);

void __fastcall judul(float x,float y) ;

void __fastcall tampil(float x,float y,int k);

void __fastcall Image1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y);

void __fastcall Image1MouseUp(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y);

void __fastcall BtBaruClick(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif



OUTPUT :