Rabu, 13 Mei 2009

grafika 7

R E N D E R I N G

1. RENDERING
Rendering (pengecatan) adalah sebuah cara dalam grafika computer untuk membuat pemandangan nampak ‘nyata’ atau visualisasi objek 3D menjadi riil. Untuk rendering objek 3D, ada beberapa factor yang mempengaruhi, diantaranya factor cahaya, sifat/karakteristik bahan, posisi kamera dan lain-lain. Suatu citra yang mengalami proses rendering yang baik akan menghasilkan gambar hasil akhir. Sedangkan tanpa rendering tidak akan menghasilkan gambar

2. LIGHTING
Lighting atau pencahayaan merupakan suatu metode yang dapat kita terapkan pada proses rendering untuk menjadikan sebuah objek menjadi terlihat berbeda. Untuk memperlihatkan bahwa lighting atau pencahayaan akan mempengaruhi pandangan terhadap sebuah objek

Dalam proses rendering , lighting dipengaruhi oleh factor-faktor sebagai berikut :

1. jarak objek dengan sumber cahaya,
2. posisi objek,
3. bentuk permukaan objek.


3. MODEL BAYANGAN

Sebuah objek akan memberikan sifat yang berbeda pada saat dikenai cahaya. Ada yang memantulkan, membiaskan ataupun menyerap cahaya. Selain itu, ada objek yang apabila dikenai cahaya maka akan menimbulkan bayangan. Terdapat dua cara pemberian bayangan pada proses rendering :

1) Bayangan rata (flat shading)

Pemberian bayangan rata (flat) merupakan cara termudah untuk dibuat. Bayangan rata mempunyai karakteristik sebagai berikut :

* Pemberian tone yang sama untuk setiap polygon.
* Penghitungan jumlah cahaya mulai dari titik tunggal pada permukaan.
* Penggunaan satu normal untuk seluruh permukaan.

Pemberian bayangan rata ini mengasumsikan bahwa setiap muka polygon dari sebuah objek adalah rata dan semua titik pada permukaan mempunyai jarak yang sama dengan sumber cahaya.

2) Bayangan halus (smooth shading)

Cara ini mengijinkan kita untuk membuat perubahan setahap demi setahap dalam pemberian bayangan pada sebuahnpermukaan. Cara ini juga mengijinkan pemberian bayangan pada satu muka lebih pudar dibandingkan muka yang lain. Ini akan menghasilkan permukaan yang lebih halus.


4. SHININESS

Shininess merupakan pemberian efek cahaya sehingga menimbulkan warna yang berkilauan. Efek berkilauan ini untuk melengkapi efek cahaya diffuse, specular dan ambient pada saat cahaya mengenai permukaan objek.

5. TEXTURING

Texturing merupakan proses penambahan tekstur ke permukaan objek. Penambahan tekstur ini dapat dilakukan dengan dua cara, yaitu :

1. Tambahkan citra bitmap atau citra lainnya ke permukaan objek,
2. Memodifikasi nilai vector normal pada permukaan objek sehingga pemberian cahaya pada permukaan didistorsi.


Script Program :


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

#include

#pragma hdrstop

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//------------------------------------------------------------------Graphics::TBitmap* pix = new Graphics::TBitmap();

RGBTRIPLE* t;

int cycle = 0;

int step;

bool stop = false;

void renderBMP(Graphics::TBitmap* picture)

{

Form1->Canvas->Draw(0, 0, pix);

}

//--------------------------------------------------- ALTER BITMAP FUNCTION

void bmpAlter(Graphics::TBitmap* picture)

{

stop = false;

Form1->ButtonStop ->Caption = "Stop";

while (!stop)

{

for (step = 0; step <>

{

if (stop) break;

for (int y = 0; y <>Height; y++)

{

t = (RGBTRIPLE*)picture->ScanLine[y];

for (int x = 0; x <>Width; x++)

{

t->rgbtRed++;

t->rgbtGreen--;

t->rgbtBlue++;

t++;

}

}

Form1->Canvas->Draw(0, 0, pix);

cycle++;

if (cycle > 255) cycle = cycle -256;

Form1->Edit1->Text = cycle;

Application->ProcessMessages();

}

}

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (OpenPictureDialog1->Execute() )

pix->LoadFromFile(OpenPictureDialog1->FileName);

}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{

renderBMP(pix);

}

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

void __fastcall TForm1::Button3Click(TObject *Sender)

{

bmpAlter(pix);

}

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

void __fastcall TForm1::ButtonStopClick(TObject *Sender)

{

stop = !stop;

if (stop) {

ButtonStop->Caption = "Start";

}

else {

ButtonStop ->Caption = "Stop";

bmpAlter(pix);

}

Application->ProcessMessages();

}

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

void __fastcall TForm1::Edit1Click(TObject *Sender)

{

cycle = 0;

Form1->Edit1->Text = cycle;

}

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

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

delete pix;

}

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

void __fastcall TForm1::FormCreate(TObject *Sender)

{

}

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



Output :


























grafika 6

Transformasi objek 3D merupakan perluasan dan teknik. Sebagaimana dalam transformasi 2D, sembarang transformasi dapat disajikan ke dalam suatu matrik transformasi dan transformasi yang lebih rumit dapat dinyatakan oleh sebuah matrik transformasi yang merupakan gabungan dari matrik-matrik transformasi dasar yang ada.

Dengan M adalah matrik 3x3


Script Program :


#include

#include

#pragma hdrstop

#include "trans3d.h"

#pragma resource "*.dfm"

TForm1 *Form1;

struct Elemen { float x,y ;} ;

Elemen Objek[17];

===========================================================================

__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[4].x,Objek[4].y);

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

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

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

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

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

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

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

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

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

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

for (i=15;i<=16;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 = 50;

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

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

Objek[5].x = 125; Objek[5].y = 125;

Objek[6].x = 75; Objek[6].y = 125;

Objek[7].x = 75; Objek[7].y = 175;

Objek[8].x = 125; Objek[8].y = 175;

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

Objek[10].x = 125; Objek[10].y = 175;

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

Objek[12].x = 75; Objek[12].y = 175;

Objek[13].x = 50; Objek[13].y = 50;

Objek[14].x = 75; Objek[14].y = 125;

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

Objek[16].x = 125; Objek[16].y = 125;

FormShow(Sender);

}

===========================================================================

void __fastcall TForm1::BtTransAtasClick(TObject *Sender)

{ int i;

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

FormShow(Sender);

}

===========================================================================

void __fastcall TForm1::BtTransKiriClick(TObject *Sender)

{ int i;

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

FormShow(Sender);

}

===========================================================================

void __fastcall TForm1::BtTRansKananClick(TObject *Sender)

{

int i;

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

FormShow(Sender);

}

void __fastcall TForm1::BtTransBawahClick(TObject *Sender)

{ int i;

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

FormShow(Sender);

}

===========================================================================

void __fastcall TForm1::BtZoomInClick(TObject *Sender)

{ int i;

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

{ Objek[i].y*=2;

Objek[i].x*=2;

};

FormShow(Sender);

}

void __fastcall TForm1::BtZoomOutClick(TObject *Sender)

{ int i;

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

{

Objek[i].y/=2;

Objek[i].x/=2;

};

FormShow(Sender);

}

===========================================================================

void __fastcall TForm1::BtPtrSBKoorClick(TObject *Sender)

{ Elemen TempObjek[17];

int i; float Sdt;

for (i=1;i<=16;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::BtPtrTTClick(TObject *Sender)

{ Elemen TempObjek[17];

int i,n,m; float Sdt;

for (i=1;i<=16;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);

}

void __fastcall TForm1::BTDefaultClick(TObject *Sender)

{

FormActivate(Sender);

}

===========================================================================

void __fastcall TForm1::BtCloseClick(TObject *Sender)

{

Close();

}


OUTPUTNYA



















Rabu, 29 April 2009

Laporan Obyek 3 Dimensi

OBYEK 3 DIMENSI


Secara konseptual, jaring polygon digunakan dalam grafika computer untuk menghasilkan objek 3D. Penciptaan objek 3D dengan computer dilakukan dengan memanipulasi jaring polygon baik dengan pemrograman dan juga pemahaman geometri 3D. Jaring polygon adalah permukaan yang dibuat dari kumpulan-kumpulan muka-muka polygon.


Jaring dapat digunakan untuk membuat ‘kulit’ dari suatu objek. Ada dua cara untuk membuat objek 3D dengan jaring polygon, yaitu :

Metode daftar titik (vertex list method)

Metode daftar muka (face list method)




Script Program

#include

#pragma hdrstop

#include "Objek3D.h"

#pragma resource "*.dfm"

TForm1 *Form1;

struct Elemen { float x,y ;} ;

Elemen Objek[17];

=========================================================================

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner) { }

=========================================================================

void __fastcall TForm1::FormActivate(TObject *Sender)

{

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

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

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

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

Objek[5].x = 125; Objek[5].y = 125;

Objek[6].x = 75; Objek[6].y = 125;

Objek[7].x = 75; Objek[7].y = 175;

Objek[8].x = 125; Objek[8].y = 175;

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

Objek[10].x = 125; Objek[10].y = 175;

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

Objek[12].x = 75; Objek[12].y = 175;

Objek[13].x = 50; Objek[13].y = 50;

Objek[14].x = 75; Objek[14].y = 125;

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

Objek[16].x = 125; Objek[16].y = 125;



FormShow(Sender);

}

=========================================================================

void __fastcall TForm1::FormShow(TObject *Sender)

{

int i;

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

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

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

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

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

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

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

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

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

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

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

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

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

Tugas Obyek 3 Dimensi

OBYEK 3 DIMENSI

Tugas 1
script program

//-----------------------------------------------------------------
#include
#pragma hdrstop

#include "Unit1.h"
//-----------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct Elemen { float x,y ;} ;
Elemen Objek[25];
//-----------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-----------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
FormShow(Sender);
}
//========================================
void __fastcall TForm1::FormShow(TObject *Sender)
{
int i;
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
Image1->Canvas->MoveTo(Objek[4].x,Objek[4].y);
for (i=1;i<=4;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[8].x,Objek[8].y);
for (i=5;i<=8;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[12].x,Objek[12].y);
for (i=9;i<=12;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[16].x,Objek[16].y);
for (i=13;i<=16;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[20].x,Objek[20].y);
for (i=17;i<=20;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[24].x,Objek[24].y);
for (i=21;i<=24;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Objek[1].x = 100; Objek[1].y = 50;
Objek[2].x = 50; Objek[2].y = 50;
Objek[3].x = 50; Objek[3].y = 100;
Objek[4].x = 100; Objek[4].y = 100;
FormShow(Sender);
}
//-----------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Objek[5].x = 100; Objek[5].y = 50;
Objek[6].x = 50; Objek[6].y = 50;
Objek[7].x = 75; Objek[7].y = 125;
Objek[8].x = 125; Objek[8].y = 125;
FormShow(Sender);
}
//-----------------------------------------------------------------


void __fastcall TForm1::Button3Click(TObject *Sender)
{
Objek[9].x = 50; Objek[9].y = 100;
Objek[10].x = 100; Objek[10].y = 100;
Objek[11].x = 125; Objek[11].y = 175;
Objek[12].x = 75; Objek[12].y = 175;
FormShow(Sender);
}
//------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)
{
Objek[13].x = 75; Objek[13].y = 125;
Objek[14].x = 125; Objek[14].y = 125;
Objek[15].x = 125; Objek[15].y = 175;
Objek[16].x = 75; Objek[16].y = 175;
FormShow(Sender);
}
//-----------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)
{
Objek[17].x = 100; Objek[17].y = 50;
Objek[18].x = 100; Objek[18].y = 100;
Objek[19].x = 125; Objek[19].y = 175;
Objek[20].x = 125; Objek[20].y = 125;
FormShow(Sender);
}
//------------------------------------------------------------------

void __fastcall TForm1::Button7Click(TObject *Sender)
{
Objek[21].x = 50; Objek[21].y = 50;
Objek[22].x = 50; Objek[22].y = 100;
Objek[23].x = 75; Objek[23].y = 175;
Objek[24].x = 75; Objek[24].y = 125;
FormShow(Sender);

}
//--------------------------------------------------------------------

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










Tugas 2

Script Program

#include
#pragma hdrstop
#include "kubus.h"
#pragma resource "*.dfm"
TForm1 *Form1;
struct Elemen { float x,y ;} ;
Elemen Objek[37];
//=========================================================================
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormActivate(TObject *Sender)
{
//segilima
Objek[1].x = 50; Objek[1].y = 100;
Objek[2].x = 100; Objek[2].y = 50;
Objek[3].x = 150; Objek[3].y = 100;
Objek[4].x = 130; Objek[4].y = 150;
Objek[5].x = 75; Objek[5].y = 150;

Objek[6].x = 30; Objek[6].y = 130;
Objek[7].x = 80; Objek[7].y = 80;
Objek[8].x = 125; Objek[8].y = 130;
Objek[9].x = 105; Objek[9].y = 180;
Objek[10].x = 50; Objek[10].y = 180;

Objek[11].x = 50; Objek[11].y = 100;
Objek[12].x = 30; Objek[12].y = 130;

Objek[13].x = 100; Objek[13].y = 50;
Objek[14].x = 80; Objek[14].y = 80;

Objek[15].x = 150; Objek[15].y = 100;
Objek[16].x = 125; Objek[16].y = 130;

Objek[17].x = 130; Objek[17].y = 150;
Objek[18].x = 105; Objek[18].y = 180;

Objek[19].x = 75; Objek[19].y = 150;
Objek[20].x = 50; Objek[20].y = 180;

//tabung
Objek[21].x = 275; Objek[21].y =75 ;
Objek[22].x = 375; Objek[22].y =75;

Objek[23].x = 275; Objek[23].y = 200;
Objek[24].x = 375; Objek[24].y = 200;
FormShow(Sender);

//segitiga
Objek[25].x = 250; Objek[25].y = 300;
Objek[26].x = 300; Objek[26].y = 300;
Objek[27].x = 275; Objek[27].y = 240;

Objek[28].x = 230; Objek[28].y = 320;
Objek[29].x = 280; Objek[29].y = 320;
Objek[30].x = 255; Objek[30].y = 260;

Objek[31].x = 230; Objek[31].y = 320;
Objek[32].x = 250; Objek[32].y = 300;

Objek[33].x = 280; Objek[33].y = 320;
Objek[34].x = 300; Objek[34].y = 300;

Objek[35].x = 255; Objek[35].y = 260;
Objek[36].x = 275; Objek[36].y = 240;

FormShow(Sender);
}

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

void __fastcall TForm1::FormShow(TObject *Sender)
{
int i;
//segilima
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);};
Image1->Canvas->MoveTo(Objek[10].x,Objek[10].y);
for (i=6;i<=10;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[12].x,Objek[12].y);
for (i=11;i<=12;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[14].x,Objek[14].y);
for (i=13;i<=14;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[16].x,Objek[16].y);
for (i=15;i<=16;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[18].x,Objek[18].y);
for (i=17;i<=18;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[20].x,Objek[20].y);
for (i=19;i<=20;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};

//tabung

Image1->Canvas->MoveTo(Objek[22].x,Objek[22].y);
for (i=21;i<=22;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[24].x,Objek[24].y);
for (i=23;i<=24;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->Ellipse(250,200,300,75);
Image1->Canvas->Ellipse(350,200,400,75);

//segitiga
Image1->Canvas->MoveTo(Objek[27].x,Objek[27].y);
for (i=25;i<=27;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[30].x,Objek[30].y);
for (i=28;i<=30;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[32].x,Objek[32].y);
for (i=31;i<=31;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[34].x,Objek[34].y);
for (i=33;i<=34;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};
Image1->Canvas->MoveTo(Objek[36].x,Objek[36].y);
for (i=35;i<=36;i++){ Image1->Canvas->LineTo(Objek[i].x,Objek[i].y);};


}
//---------------------------------------------------------------------------

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: