Enter your email address:

Delivered by

Uploud File di Ziddu dan dapat uang broo
Uploud File di Deposit Files

Home

Label:

NAMA KELOMPOK 2 :

DEDI IRAWAN
KUKUH HERU Z
PURWOKO DC
HERU CAHYONO
NOVAN PUJI M
ISMAIL M
MARIANO AW
IRENK SURYA AK
DHEMI AL


ALGORITMA UNTUK PENGGAMBARAN GARIS

Penggambaran grafik garis lurus dan kurva memerlukan waktu komputasi yang tinggi, untuk mereduksi waktu komputasi yang tinggi tersebut dapat dilakukan dengan peningkatan kemampuan komputasi prosesor dan peningkatan efisiensi algoritma. Algoritma Midpoint merupakan Algoritma dengan dasar operasi bilangan integer, sehingga memerlukan waktu operasi yanglebih sedikit dibandingkan dengan algoritma yang menggunakan operasi bilangan riel.
Read More>>
************************************************************************************************************

LINGKARAN BRESENHAM
============================================
= 1. MOKHAMAD IRWAN ALIFI (076403020009)
= 2. SLAMET WAHYU UTOMO (076403020005)
= 3. IRWANTO (070403020031)
= 4. M. NURIL ANWAR (070403020013)
= 5. M. RIDHO SANTOSO (070403020020)

= 6. MIEISA PALUPI (086403020002)
= 7. DWI SUGI P. (076403020006)
= 8. ARIF ARDIASYAH (070403020016)

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

Algoritma lingkaran bresenham memerlukan menggambar pada octant yang pertama saja sedangkan titik-titik pada kuadran lain dapat diperoleh pada pencerminan titik-titik pada oktan pertama.
Read More >>
************************************************************************************
nama kelompok :

lidya wati
wulan hernawati
sri kurniasih
raghyl sasmitha
suharjono
gigih prananto
tri murwono
arifai

GAMBAR TRANFORMASI 2D









unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;


Read More >>
************************************************************************************************
Transformasi dua dimensi
Dasar Teori


Viewport
Objek yang akan digambar pada layar bias
anya memiliki ukuran yang jauh lebih besar dibanding ukuran layar, sehingga perlu dilakukan pemetaan/transformasi yang memungkinkan objek tersebut bisa digambar pada layar. Meskipun demikian, objek seringkali terlalu rumit untuk ditampilkan pada layar dengan koordinat yang sangat terbatas. Sehingga biasanya kita memilih bagian tertentu dari objek untuk ditampilkan pada layar. Didalam memilih objek yang akan ditampilkan biasanya dibatasi oleh sebuah kotak yang disebut dengan jendela (window).
Dalam praktek kita bisa menggunakan seluruh atau sebagian lebar layar untuk menmpilkan objek yang berada pada sebuah jendela. Daerah layar yang dipilih untuk menampilkan objek yang dimaksud disebut viewport. Dalam keadaan normal, viewport akan meliputi seluruh layar lebar. Meskipun demikian, kita bisa memilih bagian tertentu dari layar untuk dijadikan sebuah viewport.

Read More >>
************************************************************************************
Transformasi 2D
=============================================
= 1. MOKHAMAD IRWAN ALIFI (076403020009)
= 2. SLAMET WAHYU UTOMO (076403020005)
= 3. IRWANTO (070403020031)
= 4. M. NURIL ANWAR (070403020013)
= 5. M. RIDHO SANTOSO (070403020020)
= 6. MIEISA PALUPI (086403020002)
= 7. DWI SUGI P (076403020006)
= 8. ARIF ARDIASYAH (070403020016)
=============================================
Struktur Titik dan Vektor
Struktur data dari titik 2D

typedef struct {

float x,y;

} point2D_t;


Sturktur Data dari vektor 2D


typedef struct {

float v[3];

} vector2D_t;


Perubahan Titik dan Vektor







************************************************************************************
KELOMPOK 1 GAMBAR TRANFORMASI 3D









unit Unit1;

interface
....
....
var
Form1: TForm1;
scr : tbitmap;
implementation
uses math,tridi;

{$R *.dfm}


Read More >>
************************************************************************************
Kelompok 2 Program 3 Dimensi












unit Main;


interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, MyOpenGL, Mesh, StdCtrls, ExtCtrls, ComCtrls,Transf3D;


Read More >>
************************************************************************************
Kelompok 3 Transformasi 3D

=============================================
= 1. MOKHAMAD IRWAN ALIFI (076403020009)
= 2. SLAMET WAHYU UTOMO (076403020005)
= 3. IRWANTO (070403020031)
= 4. M. NURIL ANWAR (070403020013)
= 5. M. RIDHO SANTOSO (070403020020)
= 6. MIEISA PALUPI (086403020002)
= 7. DWI SUGI P (076403020006)
= 8. ARIF ARDIASYAH (070403020016)
=============================================

Transformasi pada obyek tiga dimensi
Pada obyek tiga dimensi dapat dilakukan 3 transformasi pokok yaitu penggeseran (translation), perputaran (rotasi) , pembesaran (scaling). Adapun jenis transformasi lain adalah pembebanan (shearing), dan pencerminan (mirroring). Didalam program, transformasi ini juga dapat dilakukan dengan mengubah persamaan menjadi operasi matriks 4x4. Adapun persamaan setiap transformasi adalah sebagai berikut.




Read More >>
************************************************************************************
KELOMPOK 1 OPEN GL
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
gmb: TImage;
procedure TrackBar1Change(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

Read More >>
************************************************************************************





Kelompok 3 Transformasi 3D

Label: , ,

============================================
= 1. MOKHAMAD IRWAN ALIFI (076403020009)
= 2. SLAMET WAHYU UTOMO (076403020005)
= 3. IRWANTO (070403020031)
= 4. M. NURIL ANWAR (070403020013)
= 5. M. RIDHO SANTOSO (070403020020)
= 6. MIEISA PALUPI (086403020002)
= 7. DWI SUGI P. (076403020006)
= 8. ARIF ARDIASYAH (070403020016)
============================================
Transformasi pada obyek tiga dimensi
Pada obyek tiga dimensi dapat dilakukan 3 transformasi pokok yaitu penggeseran (translation), perputaran (rotasi) , pembesaran (scaling). Adapun jenis transformasi lain adalah pembebanan (shearing), dan pencerminan (mirroring). Didalam program, transformasi ini juga dapat dilakukan dengan mengubah persamaan menjadi operasi matriks 4x4. Adapun persamaan setiap transformasi adalah sebagai berikut.
1. Penggeseran (translation)
( x’, y’,z’ ) = ( Tx +x, Ty +y, Tz +z)
dengan x’,y’, z’ : koordinat hasil transformasi
x,y,z : koordinat titik awal
Tx,Ty, Tz : faktor penggeseran kearah x, y, z
2. Pembesaran (scaling)
( x’,y’,z’ ) = (Sx *x, Sy *y, Sz *z)
dengan Sx,Sy, Sz : faktor pembesaran kearah x, y, z
3. Perputaran (rotation)
a) terhadap sumbu x
( x’,y’, z’ ) = (x , y *cos q +z*sinq, - y *sinq+z*consq)
b) terhadap sumbu y
( x’,y’,z’ ) = ( x *cos q +z*sinq,y , - x *sinq+z*consq)
c) terhadap sumbu z
(x’,y’, z’ ) = ( x *cos q +y*sinq, - x*sinq+y*consq , z )
dengan q : sudut putar berlawanan arah jarum jam

Teknik penampilan obyek 3 dimensi

Pada sistem dua dimensi obyek gambar dua dimensi dapat langsung di aplikasikan pada layar karena memiliki dimensi yang sama, kalaupun ada perbedaan hanya pada arah sumbunya. Koordinat Cartesian memiliki sumbu y arah ke atas, sedangkan koordinat layar sumbu y ke arah bawah. Akan tetapi dengan sedikit modifikasi atau menggunakan fungsi bahasa pemrograman tertentu misalnya Borland C++ 4.0 keatas dengan fungsi terpasang, koordinat layar dapat disesuaikan dengan kordinat kartesian dengan sumbu y ke arah atas. Pada sistem tiga dimensi setiap titik memiliki 3 koordinat yaitu koordinat x, y, dan z, sedangkan layar hanya memiliki sumbu x dan y. Oleh karena itu diperlukan transformasi dari koordinat tiga dimensi atau disebut dengan koordinat dunia menjadi koordinat dua dimensi. Beberapa metode untuk menampilkan efek tiga dimensi pada layar dua dimensi selain metode kamera sintetis yaitu proyeksi paralel, dan proyeksi perspektif.

a. Proyeksi Paralel

Proyeksi paralel merupakan teknik dasar untuk penyajian obyek tiga dimensi pada layar dua dimensi, yang bertumpu pada 3 sudut pandang. Pandangan depan, pandangan samping dan pandangan atas. Contoh proyeksi paralel seperti pada gambar 1. Untuk menggambarkan proyeksi paralel dalam tiga dimensi diperlukan beberapa sudut pandang minimal atas, samping dan depan kemudian di proyeksikan dalam koordinat tiga dimensi sehingga seperti terlihat pada gambar

Proyeksi parallel merupakan teknik yang relatif sederhana tetapi gambar yang ditampilkan masih sulit untuk dibayangkan sebagai image tiga dimensi, seperti pada gambar 1. Untuk itu dikembangkan cara lain yaitu dengan teknik proyeksi perspektif seperti pada gambar 2.

b. Proyeksi Perspektif


Proyeksi perspektif adalah bentuk gambar tiga dimensi seperti yang dilihat pada kenyataan sesungguhnya seperti yang terlihat oleh mata manusia ataupun kamera. Teknik ini lebih menggambarkan keadaan yang sesungguhnya tetapi untuk obyek dalam bentuk gambar rangka (wire frame) untuk kedalaman tertentu dapat menimbulkan dualisme gambar. Misalnya bagian yang terkesan didalam kadang-kadang juga terkesan di luar.

c. Kamera sintetis

Metode pendekatan yang telah dibahas dengan teknik proyeksi diatas masih belum mampu menghasilkan efek 3 dimensi dengan baik. Pada proyeksi paralel yang terlihat oleh pengamat hanyalah bagian depan obyek sedang bagian yang lebih jauh untuk posisi x, dan y yang sama tak terlihat. Sedangkan pada proyeksi perspektif mata harus terletak pada sumbu koordinat z, yang berarti bidang pandang harus berimpit dengan bidang koordinat, misalnya xy. Dengan ketentuan ini maka penyajian obyek tiga dimensi menjadi terbatas. Untuk mengatasi hal tersebut sebelum diproyeksikan diperlukan proses transformasi rotasi sehingga suatu obyek dapat dipandang dari berbagai posisi, atas, bawah, samping dan lain sebagainya. Terdapat dua cara yang identik untuk memandang suatu obyek dari berbagai sisi yakni bidang pandang (view plane) pada posisi tetap, obyek diputar atau bidang pandang berputar sedangkan obyek tetap. Bila digunakan cara kedua dengan bidang pandang dianggap sebagai film dalam kamera, maka suatu obyek dapat di pandang dari berbagai sisi dengan menggerakkan dan memutar kamera. Metode ini sering disebut dengan metode kamera sitetis (synthetic camera) seperti pada gambar 3.


Contoh menggunakan Delphi 7

Screen Shoot



Script :



unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, MyOpenGL, Mesh, StdCtrls, ExtCtrls, ComCtrls,Transf3D;

type
TForm1 = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
ETRZ: TEdit;
ETRY: TEdit;
ETRX: TEdit;
Trx: TLabel;
Label1: TLabel;
Label2: TLabel;
TranslasiBtn: TButton;
GroupBox2: TGroupBox;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ESZ: TEdit;
ESY: TEdit;
ESX: TEdit;
SkalaBtn: TButton;
GroupBox3: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
ERZ: TEdit;
ERY: TEdit;
ERX: TEdit;
RotasiBtn: TButton;
ESudut: TEdit;
VertexView: TListView;
Label6: TLabel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure TranslasiBtnClick(Sender: TObject);
procedure SkalaBtnClick(Sender: TObject);
procedure RotasiBtnClick(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
ftrx, ftry, ftrz:real;
frx, fry, frz:real;
fsx,fsy,fsz:real;
fsudut:real;
fmode_transformasi:byte;
fKubus:TKubus;
fTransf:TTransf3D;
procedure AmbilVertex;
procedure TransformVertex;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const
TRANSF_TRANSLASI = 0;
TRANSF_ROTASI = 1;
TRANSF_SKALA = 2;

procedure TForm1.TransformVertex;
var
index:integer;
vp,v:TVertex3D;
begin
for index:=0 to fKubus.VertexCount-1 do
begin
v:=fKubus.Vertex[index];
fTransf.Transform(v.vertex, vp.vertex);
fKubus.ChangeVertex(index,vp.vertex.x, vp.vertex.y, vp.vertex.z);
end;
end;

procedure TForm1.AmbilVertex;
var
index:integer;
item:TListItem;
begin
//bersihkan VertexView
VertexView.Items.Clear;
for index:=0 to fKubus.VertexCount-1 do
begin
item:=VertexView.Items.Add;
with fKubus do
begin
item.Caption:= Format('%2.2f',[Vertex[index].vertex.x]);
item.SubItems.Add(Format('%2.2f',[Vertex[index].vertex.y]));
item.SubItems.Add(Format('%2.2f',[Vertex[index].vertex.z]));
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fKubus:=TKUbus.Create(true,true,1.0,1.0,0.0);
fKubus.ChangeColor(KUBUS_ATAS,1.0,0.0,0.0);
fTransf:=TTransf3D.Create;

ftrx:=0; ftry:=0; ftrz:=0;
frx:=0; fry:=0; frz:=0;
fsx:=0; fsy:=0; fsz:=0;
fmode_transformasi:=9;

glDC:=GetDC(Handle);
InitOpenGL(glDC);
Axis3D:=TAxis3D.Create;
glEnable(GL_DEPTH_TEST);
// glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glViewport(Panel1.Width,0,Width-Panel1.Width,Height-Memo1.Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;

gluPerspective(45, (width - Panel1.Width)/height,1.0, 100.0);
gluLookAt(3.0, 2.0, 3.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
index:integer;
v,vp:TPoint3D;
begin
glClearCOlor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
{ glLoadIdentity;
case fmode_transformasi of
TRANSF_TRANSLASI : glTranslatef(ftrx,ftry,ftrz);
TRANSF_ROTASI : glRotatef(fsudut, frx, fry, frz);
TRANSF_SKALA : glScalef(fsx,fsy,fsz);
end;}

fKubus.Draw;
Axis3D.Draw;
glFlush;
//update daftar vertex
AmbilVertex;
end;

procedure TForm1.TranslasiBtnClick(Sender: TObject);
begin
ftrx:=StrToFloat(ETRX.Text);
ftry:=StrToFloat(ETRY.Text);
ftrz:=StrToFloat(ETRZ.Text);
fmode_transformasi:=TRANSF_TRANSLASI;
fTransf.ClearTransformation;
fTransf.Translation(ftrx,ftry,ftrz);
TransformVertex;
Repaint;
end;

procedure TForm1.SkalaBtnClick(Sender: TObject);
begin
fsx:=StrToFloat(ESX.Text);
fsy:=StrToFloat(ESY.Text);
fsz:=StrToFloat(ESZ.Text);
fmode_transformasi:=TRANSF_SKALA;
fTransf.ClearTransformation;
fTransf.Scaling(fsx,fsy,fsz,0,0,0);
TransformVertex;
Repaint;
end;

procedure TForm1.RotasiBtnClick(Sender: TObject);
begin
frx:=StrToFloat(ERX.Text);
fry:=StrToFloat(ERY.Text);
frz:=StrToFloat(ERZ.Text);
fsudut:=StrToFloat(ESudut.Text);
fmode_transformasi:=TRANSF_ROTASI;
fTransf.ClearTransformation;
fTransf.Rotation(fsudut,frx,fry,frz);
TransformVertex;
Repaint;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(Panel1.Width,0,Width-Panel1.Width,Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;

gluPerspective(45, (width - Panel1.Width)/height,1.0, 100.0);
gluLookAt(8.0, 4.0, 9.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
Repaint;
end;

end.



Download Sample Program

Download Program Source





Kelompok 1 Open GL

Label:

OPEN GL


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
gmb: TImage;
procedure TrackBar1Change(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TrackBar1Change(Sender: TObject);
var
r,y,x,x1,y1,x2,y2,x3,y3,x4,y4:integer;
xc,yc:integer;
pos1,pos2,pos3,pos4,pos5:Tpoint;
begin

with gmb.Canvas do

begin
rectangle (0,0,width,height);
end;
xc:=gmb.width div 2; yc:=gmb.Height div 2;
gmb.Canvas.MoveTo(xc,yc+50);

r:=50;

y:=round(r*sin(Trackbar1.position*pi/1...
x:=round(r*cos(Trackbar1.position*pi/1...
y1:=round(r*sin((Trackbar1.Position+72...
x1:=round(r*cos((Trackbar1.Position+72...
y2:=round(r*sin((Trackbar1.Position+14...
x2:=round(r*cos((Trackbar1.Position+14...
y3:=round(r*sin((Trackbar1.Position+21...
x3:=round(r*cos((Trackbar1.Position+21...
y4:=round(r*sin((Trackbar1.Position+28...
x4:=round(r*cos((Trackbar1.Position+28...

pos1.X:=xc+x; pos1.Y:=(yc+50)-y;
pos2.X:=xc+x1; pos2.Y:=(yc+50)-y1;
pos3.X:=xc+x2; pos3.Y:=(yc+50)-y2;
pos4.X:=xc+x3; pos4.Y:=(yc+50)-y3;
pos5.X:=xc+x4; pos5.Y:=(yc+50)-y4;

gmb.Canvas.pen.Color:=clred;
gmb.Canvas.Pen.style:=pssolid;
gmb.Canvas.polygon ([pos1,pos2,pos3,pos4,pos5,pos1]);

gmb.Canvas.Pen.color:=clred;

gmb.Canvas.MoveTo(xc,yc-50);
gmb.canvas.lineto(pos1.X,pos1.y);
gmb.Canvas.MoveTo(xc,yc-50);
gmb.canvas.lineto(pos2.X,pos2.y);
gmb.Canvas.MoveTo(xc,yc-50);
gmb.canvas.lineto(pos3.X,pos3.y);
gmb.Canvas.MoveTo(xc,yc-50);
gmb.canvas.lineto(pos4.X,pos4.y);
gmb.Canvas.MoveTo(xC,yc-50);
gmb.canvas.lineto(pos5.X,pos5.y);





gmb.Canvas.textout(pos1.X+2,pos1.Y+2,'('...
gmb.Canvas.textout(pos2.X+2,pos2.Y+2,'('...
gmb.Canvas.textout(pos3.X+2,pos3.Y+2,'('...
gmb.Canvas.textout(pos4.X+2,pos4.Y+2,'('...
gmb.Canvas.textout(pos5.X+2,pos5.Y+2,'('...

gmb.Canvas.Pen.Color:=claqua;
gmb.canvas.moveto(xc,0);gmb.Canvas.lin...
gmb.canvas.moveto(0,yc);gmb.Canvas.lin...
application.processmessages;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
gmb.Picture.Bitmap:=Tbitmap.Create;
doublebuffered:=true;
//windouwstate:=WSmaximized;

end;

procedure TForm1.FormResize(Sender: TObject);
begin
with gmb.Picture.Bitmap do
begin
width:=gmb.width;
height:=gmb.Height;

end;
end;
end.



Kelompok 1 Transformasi 3D

Label:

GAMBAR TRANFORMASI 3D







































unit Unit1;


interface
....
....
var
Form1: TForm1;
scr : tbitmap;
implementation
uses math,tridi;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
scr:=tbitmap.create;
scr.width:=320;
scr.height:=240;
scr.PixelFormat:=pf32bit;
end;

end.

{$i getresult}
var scene:tscene;
gruplampu:tlightgroup;
lampu:array[0..10] of tbaselight;
tank:tobj3d;
procedure initgame;
begin
tank:=tobj3d.create;
loadmodel(tank,'tank1.obj',0);

textures[0]:=ttexture.createsolid($ffffff);

scene:=tscene.create(320,240);

gruplampu:=tlightgroup.create(scene,255,255,255);
lampu[0]:=tsunlight.create(gruplampu,-50,50,-200,50,0);

end;
procedure gameloop;
begin
scene.reset;
scene.addlights(gruplampu);
camx:=0;
camy:=0;
camz:=-1000;
tank.rotate(1,0,0);
tank.submit;
scene.uploadgeom(@vertexs[0],@faces[0],wnv,wnf);
scene.drawscene(true,1+2);
scene.uploadlight;
scene.modulate;
end;

// kode ditambahkan pada form create
procedure TForm1.FormCreate(Sender: TObject);
begin
scr:=tbitmap.create;
scr.width:=320;
scr.height:=240;
scr.PixelFormat:=pf32bit;
initgame;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
gameloop;
getresult(scr,scene);
canvas.Draw(0,0,scr);
end;



kelompok 2 Program DDA & bresenham

Label:

NAMA KELOMPOK 2 :

DEDI IRAWAN
KUKUH HERU Z
PURWOKO DC
HERU CAHYONO
NOVAN PUJI M
ISMAIL M
MARIANO AW
IRENK SURYA AK
DHEMI AL


ALGORITMA UNTUK PENGGAMBARAN GARIS
Penggambaran grafik garis lurus dan kurva memerlukan waktu komputasi yang tinggi, untuk mereduksi waktu komputasi yang tinggi tersebut dapat dilakukan dengan peningkatan kemampuan komputasi prosesor dan peningkatan efisiensi algoritma. Algoritma Midpoint merupakan Algoritma dengan dasar operasi bilangan integer, sehingga memerlukan waktu operasi yanglebih sedikit dibandingkan dengan algoritma yang menggunakan operasi bilangan riel.
Implementasi ke dalam bahasa pemrograman C dari kedua macam algoritma diatas, menunjukkan bahwa waktu komputasi algoritma midpoint lebih cepat sebesar 8 kali pada pembuatan garis lurus, dan lebih cepat sebesar 15 kali pada penggambaran lingkaran, dibandingkan dengan waktu komputasi algoritma yang menggunakan dasar operasi bilangan riel. Dan waktu komputasi algoritma midpoint lebih cepat sebesar 6 kali pada pembuatan garis lurus, dibandingkan dengan waktu komputasi lgoritma yang Breserham telah menggunakan dasar operasi bilangan integer juga.
Kata kunci: Penggambaran garis, penggambaran kurva,
Algoritma Bresenham, Algoritma midpoint, Algoritma DDA.
1. PENDAHULUAN
Perkembangan kemampuan komputasi prosesor yang pesat telah membuatkomputer desktop mempunyai kemampuan komputasi yang besar. Hal inimendorong perkembangan program aplikasi yang memerlukan komputasi yangbesar seperti program aplikasi yang menggunakan grafik 3 dimensi.Peningkatan kemampuan komputasi prosesor untuk aplikasi grafik yangsarat komputasi, perlu dibarengi peningkatan efisiensi algoritma,sehingga pembuatan grafik garis dan kurva yang merupakan dasar pembuatangrafik dapat memberikan hasil yang optimal.
Algoritma midpoint merupakan algoritma pembuatan garis dan kurva dengan dasar operasi bilangan integer yang menonjolkan ciri kecepatan. Sehingga algoritma ini dapat dipakai sebagai algoritma pembuatan grafik yang menuntut kecepatan sebagai hal yang diutamakan. Pembahasan algoritma Midpoint dilakukan dengan mengasumsikan garis lurus dari kiri ke kanan,dan gadient antara 0 dan 1, sedangkan untuk lingkaran dengan mengasumsikan hanya sebagian lingkaran dengan sudut sebesar 45° , hal ini dilakukan untuk mempermudah penjelasan, sedangkan untuk kondisi yanglain dapat diderivasi dengan cara yang serupa. Untuk mendapatkan kinerja algoritma midpoint, dilakukan uji kecepatan komputasi dengan cara mengimplementasikan kedalam bahasa pemrograman C, dan melakukan perbandingan waktu komputasi dengan algoritma yang menggunakan dasar komputasi bilangan riel, maupun algoritma lain yang telah banyak dikenal seperti algoritma dda dan algoritma bressenham.
2. GARIS LURUS
Garis lurus dinyatakan dinyatakan dalam persamaan :
y = mx + c (1)
dimana : m : gradient dan
c : konstanta.
Untuk menggambarkan piksel-piksel dalam garis lurus, parameter yang digunakan tergantung dari gradient, jika besarnya gradient diantara 0 dan 1, maka digunakan sumbu x sebagai parameter dan sumbu y sebagai hasil dari fungsi, sebaliknya, bila gradient melebihi 1, maka sumbu y digunakan sebagai parameter dan sumbu x sebagai hasil dari fungsi, hal ini bertujuan untuk menghindari terjadinya gaps karena adanya piksel yang terlewatkan. Hasil dari fungsi biasanya merupakan bilangan riel, sedangkan koordinat pixel dinyatakan dalam bilangan integer (x,y), maka diperlukan operasi pembulatan kedalam bentuk integer terdekat. Penggambaran garis lurus dengan metode diatas dimulai dengan operasibilangan riel untuk menghitung gradient m dan konstanta c.
m = (y2 - y1 ) / (x2-x1) (2)
c = y1 ? m* x1* (3)
Operasi bilangan riel berikutnya adalah menghitung nilai y dengan persamaan (1) Untuk mendapatkan koordinat piksel (x,y), untuk setiapnilai x, dari =x1 sampai x=x2, operasi inilah yang perlu dihindari,karena operasi ini memerlukan waktu operasi yang besar.
2.1 Algoritma Bresenham
Bresenham pada tahun 1965, melakukan perbaikan dari algoritma perhitungan koordinat piksel yang menggunakan persamaan (1), dengan cara menggantikan operasi bilangan riel perkalian dengan operasi penjumlahan, yang kemudian dikenal dengan Algoritma Bresenham. 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.
2.2 Algoritma Midpoint untuk Penggambaran Garis
Algoritma midpoint dikembangkan oleh Pitteway pada tahun 1967. Pada gambar 1, titik abu-abu menyatakan posisi piksel, titik hitam menyatakan posisi piksel yang telah digambar. Berdasarkan piksel ke n yang telah digambar, diperlukan metode untuk menentukan piksel berikut yang akan digambar, karena penggambaran dilakukan dari kiri ke kanan, maka piksel berikutnya harus pada kolom n+1. Karena gradien diantara 0 dan 1, maka piksel berikutnya adalah pada posisi titik p atau titik q.

Persamaan garis lurus yang telah dinyatakan dalam persamaan (1) dapat dinyatakan dalam fungsi x,y berikut.
*f(x, y) = ax + by + c = 0 *(4)
Fungsi f(x,y) dalam persamaan (4), akan memberikan nilai 0 pada setiap titik yang terletak pada garis, dan bernilai positip pada setiap titik yang terletak dibawah garis, dan bernilai negatif pada setiap titik yang terletak diatas garis. Maka untuk menentukan apakah titik P atau Q sebagai koordinat piksel berikutnya, maka dilakukan dengan cara menghitung nilai fungsi f(x,y) dalam persamaan (4) pada titik P dan titik Q . Jika fungsi f(x,y) tersebut memberikan nilai positif, maka piksel berikutnya adalah Q, sebaliknya piksel berikutnya adalah P.
*g(x, y) = f(xn + 1, yn + 1/2) *(5)
Fungsi g(x,y) persamaan (5) merupakan variabel penentu, dengan mengevaluasi g (x, y) dapat ditentukan piksel berikutnya yang mana berdasarkan tanda plus atau minus dari hasil fungsi g(x,y). Untuk mempercepat komputasi fungsi g(x,y), dilakukan dengan cara incremental berdasarkan nilai sebelumnya. Untuk setiap piksel, increment sederhana (DeltaG) dipakai sebagai variabel penentu. Karena hanya ada 2 pilihan piksel pada setiap tahap, maka hanya ada 2 increment yang dapat digunakan. Hal ini dilakukan dengan cara pengurangan nilai g(x,y) yang berurutan dengan menggunakan persamaan 4 dan persamaan 5.
*DeltaG = a * DeltaX + b * DeltaY *(6)
Dimana DeltaX dan DeltaY adalah increment yang dipakai pada x dan y, yang bernilai 0 atau 1. Bila bergeser 1 piksel ke kanan :
*DeltaG1 = a* (7)
Bila bergeser 1 piksel ke kanan dan 1 piksel ke atas.
*DeltaG2 = a + b *(8)
Jadi nilai dari variable penentu dapat dihitung dari nilai sebelumnya dengan cara menambah dengan (a) atau (a+b). Algoritma untuk menggambar garis lurus dari (x1, y1) sampai (x2, y2) dilakukan dengan langkah-langkah sebagai-berikut:
1. Gambar piksel pertama (x1,y1). Hitung variabel penentu dengan persamaan (3).
2. Tentukan tanda variabel penentu. Jika variabel penentu bernilai positif, increment x dan y dan tambahkan (a+b) pada vaiabel penentu, sebaliknya increment x dan y dan tambahkan (a) pada variabel penentu.
3. Plot piksel pada posisi (x, y).
4. Ulangi langkah mulai langkah kedua, sampai piksel terakhir (x2,y2).
3. LINGKARAN
Kurva lingkaran dinyatakan dinyatakan dalam persamaan :
*(x-xc) ^2 + (y-yc) ^2 = r ^2 *(9)
dimana : (xc,yc) : koordinat titik pusat lingkaran
r : jari-jari lingkaran
Untuk menggambarkan piksel-piksel dalam kurva lingkaran, dapat digunakan sumbu x dari x = (xc-r) sampai x = (xc+r) sebagai parameter dan sumbu y sebagai hasil dari persamaan (10)
*y = yc +- sqrt(r ^2 - (x-xc) ^2 *(10)
Algoritma ini memerlukan waktu operasi yang besar, karena mengandung operasi bilangan riel perkalian maupun eksponential, dan menghasilkan posisi koordinat piksel yang tidak merata, karena terjadinya gaps yang disebabkan adanya perubahan gradient.
Untuk menghindari posisi koordinat piksel yang tidak merata, koordinat piksel (x,y) dinyatakan dengan menggunakan koordinat polar dalam persamaan (11)
*x = xc + r cos q *(11a)
*y = yc + r sin q *(11b)
Persamaan (11) diatas mengandung operasi bilangan riel perkalian untuk mendapatkan koordinat piksel (x,y), untuk setiap nilai x, dari x = (xc-r) sampai x = (xc+r), operasi inilah yang perlu dihindari, karena operasi ini memerlukan waktu operasi yang besar.
3.1 Algoritma Midpoint
Komputasi untuk membuat kurva lingkaran dimulai dengan mengidentifikasi bagian-bagian dari lingkaran yang dapat ditentukan dengan menggunakan sifat simetri, hal ini dilakukan dengan cara membagai lingkaran dengan masing-masing mempunyai sudut sebesar 45° , sehingga dalam sebuah lingkaran dibagi menjadi 8 bagian. Sebagai contoh, digambarkan bagian dari lingkaran dari sudut 90° sampai 45° . Seperti pada algoritma midpoint untuk garis lurus, maka pada setiap tahapan, terdapat 2 koordinat piksel yang harus dipilih yaitu (x+1, y) atau (x+1, y-1).
Gambar 2. Lingkaran
Langkah berikutnya, adalah menyatakan persamaan lingkaran dan fungsi untuk menentukan variabel penentu. Persamaan lingkaran dengan pusat (0,0) dinyatakan dalam persamaan (12).
*f(x, y) = x*x + y+y - r*r = 0 *(12)
Fungsi f(x, y) persamaan (12) akan bernilai positif jika titik (x,y) diluar lingkaran, dan bernilai negatif jika titik (x,y) didalam lingkaran. Fungsi untuk variabel penentu dan increment dinyyatakan dalam persamaan (13), (14), dan (15).
g(x, y) = (x + 1) (x + 1) + (y - 1/2) (y - 1/2) - r*r (13)
*DeltaG1 = 2x + 3 (14)
*DeltaG2 = 2x - 2y + 5 (15)
Berbeda dengan nilai dari increment pada algoritma garis lurus yang bernilai konstan, pada kurva lingkaran, increment tidak konstan. Terlihat bahwa komputasi increment memerlukan operasi perkalian, tetapi operasi perkalian dapat diubah dengan cara komputasi nilai increment secara increment pula, sehingga diperlukan 2 komputasi increment dalam setiap piksel yang diproses. Secara umum, kurva polinomial orde n memerlukan n level increment. Pada titik awal (x1,y1), komputasi variabel penentu mempunyai bagian bilangan riel, sehingga operasi bilangan integer tidak dapat digunakan secara langsung.
Dalam praktek hal ini diselesaikan dengan cara menambahkan nilai 1/4 pada variable penentu. Hal ini tidak mempengaruhi perubahan tanda bilangan, karena operasi yang dilakukan adalah operasi bilangan integer, sehingga menghasilkan operasi yang lebih cepat.




KESIMPULAN
Panjang garis atau banyak piksel dalam garis lurus sangat berpengaruh terhadap perbandingan performance antara sebuah algoritma dengan algoritma yang lain, hal ini disebabkan adanya perbedaan waktu operasi yang berada didalam perulangan sepanjang pembuatan piksel, dan waktu operasi yang berada pada sebelumnya. Panjang jari-jari dalam lingkaran tidak berpengaruh terhadap perbandingan performance antara sebuah algoritma dengan algoritma yang lain, hal ini menunjukkan perbandingan waktu operasi yang berada didalam perulangan sepanjang pembuatan piksel, dan waktu operasi yang berada pada sebelumnya berimbang.
Algoritma dengan dasar operasi bilangan integer memberikan waktu operasi yang lebih cepat dibandingkan dengan algoritma dengan dasar operasi bilangan riel, hal ini ditunjukkan dengan waktu komputasi algoritma DDA, algoritma Bresenham dan algoritma Midpoint yang lebih cepat, baik pada pembuatan garis lurus maupun lingkaran dibandingan waktu komputasi dengan algoritma yang menggunakan dasar operasi bilangan riel. Algoritma midpoint memberikan waktu operasi tercepat diantara algoritma penggambaran garis lurus yang telah menggunakan dasar operasi bilangan integer, seperti algoritma DDA, algoritma Bresenham. Jadi algoritma Midpoint merupakan algoritma yang cocok untuk penggambaran grafik yang menuntut kecepatan sebagai hal yang diutamakan.

Download Artikel Lengkap (pdf)






unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
ColorDialog1: TColorDialog;
Button2: TButton;
Panel1: TPanel;
Button3: TButton;
Image1: TImage;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Panel1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
var x1,x2,y1,y2:Integer;

var klik:Boolean;
implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var i,j:Integer;
var m,b :Real;

begin
m:=(y2 - y1) / (x2 - x1);
b:=y1 - m * x1;
if x1 <> x2 then
begin
for i:=x2 to x1 do
begin
j:= round(m * i + b);
image1.Canvas.Pixels[i,j]:=Panel1.Color;
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Canvas.FillRect(Image1.ClientRect);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if klik=False then
begin
x1:=x;
y1:=y;
klik:=True;
end
else if klik=true then
begin
x2:=x;
y2:=y;
klik:=false;
end;
image1.Canvas.Pixels[x,y]:=Panel1.Color;

label1.Caption:=IntToStr( x1);
label2.Caption:=IntToStr(y1);
label3.Caption:=IntToStr( x2);
label4.Caption:=IntToStr(y2);
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
if ColorDialog1.Execute then Panel1.Color:=ColorDialog1.Color;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Application.Terminate;
end;
end.


Download Program Lengkap



Kelompok 2 program 3 dimensi

Label:

Pendahuluan

Salah satu bentuk perkembangan terakhir penerapan komputer dalam

bidang grafika adalah pada aplikasi simulasi obyek tiga dimensi atau lebih

dikenal dengan sebutan kenyataan semu (virtual reality-VR). Aplikasi ini

dijumpai pada berbagai bidang dari yang sifatnya hiburan, rancang-bangun,

sampai pada simulasi untuk keperluan riset ilmiah.

Untuk mendukung adanya VR selain diperlukan suatu metode untuk

memvisualisasikan obyek 3 dimensi pada layar 2 dimensi juga didukung

perangkat keras berupa monitor yang langsung dipakai seperti memakai

kacamata dan sensor-sensor yang dipakai oleh pemakai.

Pada implementasi yang lebih sederhana dapat digunakan komputer yang

dipakai sehari-hari dengan layar monitor sebagai media penampil dan

berbagai alat input yang umum dipakai misalnya keyboard, mouse, joystick,

dan lain sebagainya.

Untuk menampilkan efek 3 dimensi pada layar 2 dimensi dengan

animasinya dapat digunakan metode analogi kamera sintetis. Dengan

metode ini suatu obyek nyata dapat dipandang dari kamera dari berbagai

jarak dan sudut pandang. Dengan mengubah jarak, sudut, dan arah

pandang akan didapatkan efek gambar dan animasi 3 dimensi di layar

kamera dari suatu obyek.

Pada implementasinya, agar didapatkan kinerja yang optimum, setiap

bagian dari obyek dibagi menjadi poligon-poligon, sehingga titik-titik yang

diproses merupakan titik acuannya saja dan setiap titik dibentuk poligon dan

diberi warna dengan kecerahan sesuai dengan posisi terhadap sumber

cahaya sintetis. Dengan demikian kualitas gambar semakin baik bila

kerapatan poligon persatuan luas semamin tinggi dengan konsekwensi beban

memori menjadi lebih tinggi dan kecepatan proses rendah, sehingga animasi

lebih kasar.

Visualisasi obyek 3 dimensi dengan komputer ini memungkinkan suatu

obyek 3 dimensi dapat dimanipulasi dan hasilnya dapat langsung terlihat

secara visual. Selain itu suatu obyek juga dapat dilihat dari berbagai jarak

dan sudut pandang serta dapat dilihat pula dalam bentuk kerangka (wire

frame) maupun solid dengan demikian apa yang terlihat lebih mendekati

pada obyek yang sesungguhnya.

Transformasi pada obyek tiga dimensi

Pada obyek tiga dimensi dapat dilakukan 3 transformasi pokok yaitu

penggeseran (translation), perputaran (rotasi) , pembesaran (scaling).

Adapun jenis transformasi lain adalah pembebanan (shearing), dan

pencerminan (mirroring). Didalam program, transformasi ini juga dapat

dilakukan dengan mengubah persamaan menjadi operasi matriks 4x4.

Adapun persamaan setiap transformasi adalah sebagai berikut.

1. Penggeseran (translation)

( x’, y’,z’ ) = ( Tx +x, Ty +y, Tz +z)

dengan x’,y’, z’ : koordinat hasil transformasi

x,y,z : koordinat titik awal

Tx,Ty, Tz : faktor penggeseran kearah x, y, z

2. Pembesaran (scaling)

( x’,y’,z’ ) = (Sx *x, Sy *y, Sz *z)

dengan Sx,Sy, Sz : faktor pembesaran kearah x, y, z

3. Perputaran (rotation)

a) terhadap sumbu x

( x’,y’, z’ ) = (x , y *cos q +z*sinq, - y *sinq+z*consq)

b) terhadap sumbu y

( x’,y’,z’ ) = ( x *cos q +z*sinq,y , - x *sinq+z*consq)

c) terhadap sumbu z

(x’,y’, z’ ) = ( x *cos q +y*sinq, - x*sinq+y*consq , z )

dengan q : sudut putar berlawanan arah jarum jam

Teknik penampilan obyek 3 dimensi

Pada sistem dua dimensi obyek gambar dua dimensi dapat langsung di

aplikasikan pada layar karena memiliki dimensi yang sama, kalaupun ada

perbedaan hanya pada arah sumbunya. Koordinat Cartesian memiliki sumbu

y arah ke atas, sedangkan koordinat layar sumbu y ke arah bawah. Akan

tetapi dengan sedikit modifikasi atau menggunakan fungsi bahasa

pemrograman tertentu misalnya Borland C++ 4.0 keatas dengan fungsi

terpasang, koordinat layar dapat disesuaikan dengan kordinat kartesian

dengan sumbu y ke arah atas.

Pada sistem tiga dimensi setiap titik memiliki 3 koordinat yaitu koordinat

x, y, dan z, sedangkan layar hanya memiliki sumbu x dan y. Oleh karena itu

diperlukan transformasi dari koordinat tiga dimensi atau disebut dengan

koordinat dunia menjadi koordinat dua dimensi.

Beberapa metode untuk menampilkan efek tiga dimensi pada layar dua

dimensi selain metode kamera sintetis yaitu proyeksi paralel, dan proyeksi

perspektif.

a. Proyeksi paralel

Proyeksi paralel merupakan teknik dasar untuk penyajian obyek tiga

dimensi pada layar dua dimensi, yang bertumpu pada 3 sudut pandang.

Pandangan depan, pandangan samping dan pandangan atas. Contoh

proyeksi paralel seperti pada gambar 1.

Untuk menggambarkan proyeksi paralel dalam tiga dimensi

diperlukan beberapa sudut pandang minimal atas, samping dan depan

kemudian di proyeksikan dalam koordinat tiga dimensi sehingga seperti

terlihat pada :




Proyeksi parallel merupakan teknik yang relatif sederhana tetapi

gambar yang ditampilkan masih sulit untuk dibayangkan sebagai image

tiga dimensi, seperti pada gambar 1. Untuk itu dikembangkan cara lain

yaitu dengan teknik proyeksi perspektif seperti pada gambar 2.

b. Proyeksi perspektif



Proyeksi perspektif adalah bentuk gambar tiga dimensi seperti

yang dilihat pada kenyataan sesungguhnya seperti yang terlihat oleh

mata manusia ataupun kamera. Teknik ini lebih menggambarkan

keadaan yang sesungguhnya tetapi untuk obyek dalam bentuk gambar

rangka ( wire frame) untuk kedalaman tertentu dapat menimbulkan

dualisme gambar. Misalnya bagian yang terkesan didalam kadang-kadang

juga terkesan di luar.


unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, MyOpenGL, Mesh, StdCtrls, ExtCtrls, ComCtrls,Transf3D;

type
TForm1 = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
ETRZ: TEdit;
ETRY: TEdit;
ETRX: TEdit;
Trx: TLabel;
Label1: TLabel;
Label2: TLabel;
TranslasiBtn: TButton;
GroupBox2: TGroupBox;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ESZ: TEdit;
ESY: TEdit;
ESX: TEdit;
SkalaBtn: TButton;
GroupBox3: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
ERZ: TEdit;
ERY: TEdit;
ERX: TEdit;
RotasiBtn: TButton;
ESudut: TEdit;
VertexView: TListView;
Label6: TLabel;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure TranslasiBtnClick(Sender: TObject);
procedure SkalaBtnClick(Sender: TObject);
procedure RotasiBtnClick(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
ftrx, ftry, ftrz:real;
frx, fry, frz:real;
fsx,fsy,fsz:real;
fsudut:real;
fmode_transformasi:byte;
fKubus:TKubus;
fTransf:TTransf3D;
procedure AmbilVertex;
procedure TransformVertex;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const
TRANSF_TRANSLASI = 0;
TRANSF_ROTASI = 1;
TRANSF_SKALA = 2;

procedure TForm1.TransformVertex;
var
index:integer;
vp,v:TVertex3D;
begin
for index:=0 to fKubus.VertexCount-1 do
begin
v:=fKubus.Vertex[index];
fTransf.Transform(v.vertex, vp.vertex);
fKubus.ChangeVertex(index,vp.vertex.x, vp.vertex.y, vp.vertex.z);
end;
end;

procedure TForm1.AmbilVertex;
var
index:integer;
item:TListItem;
begin
//bersihkan VertexView
VertexView.Items.Clear;
for index:=0 to fKubus.VertexCount-1 do
begin
item:=VertexView.Items.Add;
with fKubus do
begin
item.Caption:= Format('%2.2f',[Vertex[index].vertex.x]);
item.SubItems.Add(Format('%2.2f',[Vertex[index].vertex.y]));
item.SubItems.Add(Format('%2.2f',[Vertex[index].vertex.z]));
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fKubus:=TKUbus.Create(true,true,1.0,1.0,0.0);
fKubus.ChangeColor(KUBUS_ATAS,1.0,0.0,0.0);
fTransf:=TTransf3D.Create;

ftrx:=0; ftry:=0; ftrz:=0;
frx:=0; fry:=0; frz:=0;
fsx:=0; fsy:=0; fsz:=0;
fmode_transformasi:=9;

glDC:=GetDC(Handle);
InitOpenGL(glDC);
Axis3D:=TAxis3D.Create;
glEnable(GL_DEPTH_TEST);
// glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glViewport(Panel1.Width,0,Width-Panel1.Width,Height-Memo1.Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;

gluPerspective(45, (width - Panel1.Width)/height,1.0, 100.0);
gluLookAt(3.0, 2.0, 3.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
index:integer;
v,vp:TPoint3D;
begin
glClearCOlor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);


fKubus.Draw;
Axis3D.Draw;
glFlush;
//update daftar vertex
AmbilVertex;
end;

procedure TForm1.TranslasiBtnClick(Sender: TObject);
begin
ftrx:=StrToFloat(ETRX.Text);
ftry:=StrToFloat(ETRY.Text);
ftrz:=StrToFloat(ETRZ.Text);
fmode_transformasi:=TRANSF_TRANSLASI;
fTransf.ClearTransformation;
fTransf.Translation(ftrx,ftry,ftrz);
TransformVertex;
Repaint;
end;

procedure TForm1.SkalaBtnClick(Sender: TObject);
begin
fsx:=StrToFloat(ESX.Text);
fsy:=StrToFloat(ESY.Text);
fsz:=StrToFloat(ESZ.Text);
fmode_transformasi:=TRANSF_SKALA;
fTransf.ClearTransformation;
fTransf.Scaling(fsx,fsy,fsz,0,0,0);
TransformVertex;
Repaint;
end;

procedure TForm1.RotasiBtnClick(Sender: TObject);
begin
frx:=StrToFloat(ERX.Text);
fry:=StrToFloat(ERY.Text);
frz:=StrToFloat(ERZ.Text);
fsudut:=StrToFloat(ESudut.Text);
fmode_transformasi:=TRANSF_ROTASI;
fTransf.ClearTransformation;
fTransf.Rotation(fsudut,frx,fry,frz);
TransformVertex;
Repaint;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(Panel1.Width,0,Width-Panel1.Width,Height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity;

gluPerspective(45, (width - Panel1.Width)/height,1.0, 100.0);
gluLookAt(8.0, 4.0, 9.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
Repaint;
end;

end.


Download Program Lengkap





ShoutMix chat widget