Jumat, 20 Maret 2009

Modul 4
TRANSFORMASI OBYEK 2 DIMENSI


Pada praktikum ini yang dilakukan adalah membuat sebuah project Transformasi Objek 2 Dimensi, seperti form yang ada di bawah ini :

Grafika computer merupakan bidang yang menarik minat banyak orang. Salah satu sub bagian dari grafika adalah pemodelan objek. Dalam pemodelan objek 2D, berbagai objek dimodifikasi dengan melakukan berbagai operasi fungsi atau operasi transformasi geometri. Transformasi ini dapat berupa transformasi dasar ataupun gabungan dari berbagai transformasi geometri. Transformasi ini dikenal dengan Transformasi affine. Pada dasarnya, transformasi merupakan suatu operasi modifikasi bentuk objek tanpa merusak bentuk dasar dari objek. Salah satu contoh transformasi adalah transformasi dari window ke viewport.

Langkah-Langkah Transformasi Viewing 2 Dimensi

    1. Pembentukan scene pada WC menggunakan output primitif atribut.

    2. Untuk mendapatkan orientasi tertentu dari window, maka ditentukan sistem VC 2 dimensi pada WC. Frame digunakan untuk melengkapi penentuan orientasi dari windows persegi empat . Setelah frame dibentuk dapat ditransformasikan ke dalam WC untuk menampilkan koordinat.

    3. Kemudian viewport ditentukan dalam normalized NVC (pada batasan antara 0 dan 1) dan memetakan deskripsi VC dari scene pada Normalized Coordinate.

    4. Akhirnya dilakukan clipping (pemotongan) pada semua gambar yang ada diluar viewport.

    1. Macam-macam transformasi:

      1. Transformasi Objek, yang ditransformasikan titik-titik yang menyusun objek tersebut.

      2. Transformasi Koordinat, yang diubah system koordinatnya sehingga objek mengalami transformasi dikarenakan perubahan system koordinat tersebut.


    1. Tujuan Transformasi :

      1. Merubah atau menyesuaikan komposisi pandangan.

      2. Memudahkan membuat objek yang simetris

      3. Melihat objek dari sudut pandang berbeda

      4. Memindahkan satu atau beberapa objek dari satu tempat ke tempat lain, biasanya digunakan pada animasi computer.

Pembuatan Antarmuka:












Scrip Program :

Unit1.cpp

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

#include 'vcl.h'

#include 'math.h'

#pragma hdrstop

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

struct Elemen { float x,y ;} ;

Elemen Objek[6];

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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

void __fastcall TForm1::FormShow(TObject *Sender)

{ int i;

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

Image1->Canvas->MoveTo(Objek[5].x,Objek[5].y);

for (i=1;i<=5;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};

}

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

void __fastcall TForm1::FormActivate(TObject *Sender)

{ Objek[1].x = 100; Objek[1].y = 50;

Objek[2].x = 50; Objek[2].y = 100;

Objek[3].x = 100; Objek[3].y = 100;

Objek[4].x = 100; Objek[4].y = 150;

Objek[5].x = 150; Objek[5].y = 100;

FormShow(Sender);

}

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

void __fastcall TForm1::Button3Click(TObject *Sender)

{ int i;

for (i=1;i<=5;i++){ Objek[i].x+=5;};

FormShow(Sender);

}

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

void __fastcall TForm1::Button4Click(TObject *Sender)

{

int i;

for (i=1;i<=5;i++){ Objek[i].y+=5;};

FormShow(Sender);

}

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

int i;

for (i=1;i<=5;i++){ Objek[i].y-=5;};

FormShow(Sender);

}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{

int i;

for (i=1;i<=5;i++){ Objek[i].x-=5;};

FormShow(Sender);

}

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

void __fastcall TForm1::Button5Click(TObject *Sender)

{

Elemen TempObjek[6];

int i; float Sdt;

for (i=1;i<=5;i++)

{ Objek[i].x=Objek[i].x-Image1->Width / 2;

Objek[i].y=Objek[i].y-Image1->Height / 2;

Sdt=10*M_PI/180;

TempObjek[i].x=(Objek[i].x*cos(Sdt)-Objek[i].y*sin(Sdt));

TempObjek[i].y=(Objek[i].x*sin(Sdt)+Objek[i].y*cos(Sdt));

Objek[i]=TempObjek[i];

Objek[i].x=Objek[i].x+Image1->Width / 2;

Objek[i].y=Objek[i].y+Image1->Height / 2;

} FormShow(Sender);

}

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


void __fastcall TForm1::Button6Click(TObject *Sender)

{

Elemen TempObjek[6];

int i,n,m; float Sdt;

for (i=1;i<=5;i++)

{

n = Objek[3].x;

m = Objek[3].y;

Objek[i].x=Objek[i].x-n;

Objek[i].y=Objek[i].y-m;

Sdt=10*M_PI/180;

TempObjek[i].x=(Objek[i].x*cos(Sdt)-Objek[i].y*sin(Sdt));

TempObjek[i].y=(Objek[i].x*sin(Sdt)+Objek[i].y*cos(Sdt));

Objek[i]=TempObjek[i];

Objek[i].x=Objek[i].x+n;

Objek[i].y=Objek[i].y+m;

}

FormShow(Sender);

}

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

Unit.h

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

#ifndef Unit1H

#define Unit1H

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

#include 'Classes.hpp'

#include 'Controls.hpp'

#include 'StdCtrls.hpp'

#include 'Forms.hpp'

#include 'ExtCtrls.hpp'

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

class TForm1 : public TForm

{

__published: // IDE-managed Components

TImage *Image1;

TPanel *Panel1;

TButton *Button1;

TButton *Button2;

TButton *Button3;

TButton *Button4;

TButton *Button5;

TButton *Button6;

void __fastcall FormShow(TObject *Sender);

void __fastcall FormActivate(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);

void __fastcall Button4Click(TObject *Sender);

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button5Click(TObject *Sender);

void __fastcall Button6Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif


OUTPUT :
Modul 3
LINGKARAN DAN ELLIPSE

Pada praktikum ini yang dilakukan adalah membuat sebuah project Lingkaran Mid point, seperti form yang ada di bawah ini :
ALGORITMA LINGKARAN 8 TITIK SIMETRIS

Proses pembentukan lingkaran dengan algoritma ini dapat dilakukan dengan menentukan suatu titik awal. Bila titik awal pada lingkaran (x,y) maka terdapat tiga posisi lain, sehingga dapat diperoleh delapan titik.

ALGORITMA LINGKARAN TITIK TENGAH (MID POINT)

Algoritma mid point juga disebut algoritma lingkaran Bressenham. Bressenham mengembangkan generator lingkaran yang cukup efisien. Algoritma yang digunakan membentuk semua titik b
erdasarkan titik pusat dengan penambahan semua jalur disekeliling lingkaran. Algoritma ini diturunkan dari algoritma mid point untuk pembentukan garis.


Pembuatan Antarmuka:













Scrip Program :

Unit1.cpp

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

#include 'vcl.h'

#pragma hdrstop

#include 'math.h'

#include 'stdlib.h'

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int tergambar, XC, YC, QX, QY;

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

__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::Button1Click(TObject *Sender)

{

tergambar=false;

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


}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Close();

}

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

void __fastcall TForm1::Image1MouseDown(TObject *Sender,

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

{

tergambar=true; XC=X; YC=Y;

}

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

void __fastcall TForm1::CirclePlotpoint(int XC, int YC, int X, int Y)

{

Image1->Canvas->Pixels[XC+X][YC+Y]=clBlack;

Image1->Canvas->Pixels[XC-X][YC+Y]=clBlack;

Image1->Canvas->Pixels[XC+X][YC-Y]=clBlack;

Image1->Canvas->Pixels[XC-X][YC-Y]=clBlack;

Image1->Canvas->Pixels[XC+Y][YC+X]=clBlack;

Image1->Canvas->Pixels[XC-Y][YC+X]=clBlack;

Image1->Canvas->Pixels[XC+Y][YC-X]=clBlack;

Image1->Canvas->Pixels[XC-Y][YC-X]=clBlack;

}

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

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

TShiftState Shift, int X, int Y)

{

int R;

Button1Click(Sender);

tergambar=false;

QX=X; QY=Y;

R=int(sqrt(pow(XC-QX,2)+pow(YC-QY,2)));

if (RadioGroup1->ItemIndex==0)

{ CircleMidPoint(XC,YC,R); }


}

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

void __fastcall TForm1::CircleMidPoint(int XC, int YC,int R)

{int x,y,p,k=0;

R=10;

x=0; y=R; p=1-R;

judul((float)x,(float)y,k,p);

do

{

k++;

if (p<0) x="x+1;">

else

{ x=x+1; y=y-1; }


if (p<0) p="p+2*x+1;">

else { p=p+2*(x-y)+1; }

CirclePlotpoint(XC,YC,x,y);

tampil((float)x,(float)y,k,p);

} while (x

}

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

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

{

{

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

int i,xt=200, yt=15;

//Menampilkan bilangan asli tanpa pembulatan

_gcvt(x,7,tampilX);

_gcvt(y,7,tampilY);

_gcvt(p,7,tampilPk);

if (k==0) { for (i=0; i<20;i++)>

else { _gcvt(k-1,10,tampilK); }

k=k+2;

//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,")");

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

}

}

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

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

{

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

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

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

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

}

Unit1.h

#include 'Controls.hpp'

#include 'StdCtrls.hpp'

#include 'Forms.hpp'

#include 'ExtCtrls.hpp'

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

class TForm1 : public TForm

{

__published: // IDE-managed Components

TRadioGroup *RadioGroup1;

TButton *Button1;

TButton *Button2;

TImage *Image1;

void __fastcall Button1Click(TObject *Sender);

void __fastcall FormActivate(TObject *Sender);

void __fastcall CirclePlotpoint(int XC, int YC, int X, int Y);

void __fastcall CircleMidPoint(int XC, int YC,int R);

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

void __fastcall Button2Click(TObject *Sender);

void __fastcall judul(float x,float y, int k, int p);

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

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif


OUTPUT :


Jumat, 13 Maret 2009

grafika 2

Pada pertemuan kali ini saya mempelajari tentang :

1. Persamaan Garis : menurut koordinat Cartesian adalah y=mx+b dimana m adalah 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, width dan color. Dalam beberapa paket aplikasi grafik, garis ditampilkan dengan menggunakan pilihan pen atau brush.
3. Tipe Garis : Garis mempunyai beberapa linetype diantaranya garis tebal, garis putus dan garis titik-titik.
4. Algoritma Garis DDA
Digital Diferencial 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 yang membentuk garis diperoleh dari perhitungan kemudian dikonversikan menjadi nilai integer.
5. Langkah-langkah pembentukan garis menurut algoritma DDA adalah :
a. Tentukan dua titik yang akan dihubungkan dalam pembentukan garis.
b. Tentukan titik awal yaitu (Xo,Y0) dan titik akhir (X1,Y1).
c. Hitung dx = x1-x0 dan dy = y1-y0
d. Tentukan step = max (|dx|, |dy|)
e. Hitung penambahan koordinat pixel Xlnc=dx / step dan Ylnc = dy / step.
f. Koordinat selanjutnya (x+Xlnc, y+ylnc).
g. Posisi pada layer ditentukan debngan pembulatan nilai koordinat tersebut.
h. Ulangi nomor 6 dan 7 untuk menentukan posisi pixel berikutnya. Sampai x=x1 dan y=y1.

Listing program DDA
#pragma hdrstop
#include "Unit1.h"
#include "math.h"
#include "stdlib.h"
//---------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int X1,X2,Y1,Y2;
int tergambar;
// Pendeklarasian sebagai awal dari program.
//---------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//mendeklarasian pada form 1.

//---------------------------------------------------------------------
void __fastcall TForm1::DDA(int xa,int ya,int xb,int yb)
{ int dx,dy,step,k;
float Xincrement,Yincrement,x,y;
xa=10;ya=10;xb=17;yb=16;
dx=xb-xa;
dy=yb-ya;
x=(float)xa;
y=(float)ya;
if (abs(dx)>abs(dy))
{ step=(abs(dx));}
else
{ step=(abs(dy));};
Xincrement = (float)dx/step;
Yincrement = (float)dy/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);
}
}
// Script diatas mendeklarasikan dari fungsi pembentukan garis DDA
//---------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
// Mendeklarasiakan pada button keluar dimana jika diklik maka akan layer akan keluar atau tertutup
//---------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
tergambar=False;
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
}
//---------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
}
//Mendeklarasikan pada button baru dimana pada button baru jika diklik maka akan mumcul layer baru.

//---------------------------------------------------------------------
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)
{
{
Button1Click(Sender);
tergambar=False;
X2=X;
Y2=Y;
if (RadioGroup1->ItemIndex==0)
{ DDA(X1,Y1,X2,Y2);
}
};
}
//---------------------------------------------------------------------
void __fastcall TForm1::judul(float x, float y)
{
char tampilX[20], tampilY[20];
int xt=200, yt=15, kt=2;
// mendeklarasikan untuk menampilkan bilangan asli tanpa pembulatan
_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)");
// Pendeklarasian untuk menampilkan bilangan yang digunakan untuk pembulatan.
_gcvt(x,2,tampilX);
_gcvt(y,2,tampilY);
// pendeklarasian untuk 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=20,yt=15;
k+=3;
// mendeklarasikan untuk 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);
// Pendeklarasian untuk menampilkan bilangan yang digunakan untuk pembulatan.
_gcvt(x,2,tampilX);
_gcvt(y,2,tampilY);
_gcvt(y,2,tampilK);
// pendeklarasian untuk 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,")");
}

Interface Awal :











Outputnya:

Rabu, 04 Maret 2009

Tugas 1


Pada praktikum pertama yang diajarkan pada plug6 adalah membuat sebuah project dengan Timage, seperti form yang ada di bawah ini :

Pembuatan Antarmuka:







Langkah-langkah pembuatannya adalah sebagai berikut :

  1. Buka aplikasi Borland C++ Builder

  2. Image (Membuat segi empat dengan putus-putus) yaitu dengan cara menggunakan Image yaitu klik additional kemudian Image lalu di drag pada pada grid atau form 1 daerah berbintik-bintik.

  3. Label (menampilkan teks posisi X dan posisi Y )

Klik additional kemudian static text kemudian drag ke daerah grid diluar kanvas atau image pada langkah kedua tadi. Kemudian buat static text sebanyak dua kali pada layar, yakni static text 1 dan static text 2.

  1. Membuat Button

Klik standard setelah itu button dan drag ke form sebanyak 3 kali, setelah itu akan tampak button 1,2 dan 3 lalu ganti caption pada object inspector

Klik standardmain menu (Membuat MainMenu sehingga dapat memudahkan dalam menggunakan aplikasi, main menu yang dibuat terdiri atas File Open, File save. Kemudian klik Dialogs OpenPictureDialogs (Membuka file yang pernah disimpan dalam aplikasi buku gambar). Setelah itu klik Dialogs SavePictureDialogs (Menyimpan file yang telah dibuat dalam aplikasi buku gambar). Kemudian klik Dialogs ColorDialogs(User dapat memilih warna pena yang akan dugunakan untuk menggambar).

Program :

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

#include vcl.h

#pragma hdrstop
#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int Tergambar;

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

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)

{

}

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

void __fastcall TForm1::FormActive(TObject *Sender)

{

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

}
void __fastcall TForm1::Button1Click(TObject *Sender)

{ if (ColorDialog1->Execute()) Image1->Canvas->Pen->Color=ColorDialog1->Color;

}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)

{

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

}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender) { Close();

}

//---------------------------------------------------------------------------
void __fastcall TForm1::OpenPictureDialog1CanClose(TObject *Sender, bool &CanClose)

{ if (OpenPictureDialog1->Execute())

{ Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

}

}

//---------------------------------------------------------------------------
void __fastcall TForm1::SavePictureDialog1CanClose(TObject *Sender, bool &CanClose)

{ if (SavePictureDialog1->Execute()) { Image1->Picture->SaveToFile(SavePictureDialog1->FileName);

} }

//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Tergambar=True; Image1->Canvas->MoveTo(X,Y); }


Output: