Home
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
************************************************************************************************************
= 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 >>
************************************************************************************
lidya wati
wulan hernawati
sri kurniasih
raghyl sasmitha
suharjono
gigih prananto
tri murwono
arifai
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 biasanya 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 >>
************************************************************************************
= 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)
=============================================
typedef struct {
float x,y;
} point2D_t;
Sturktur Data dari vektor 2D
typedef struct {
float v[3];
} vector2D_t;
************************************************************************************
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)
=============================================
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 >>
************************************************************************************
03.10 | 0 Comments
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)
============================================
1. Penggeseran (translation)
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 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
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.
02.05 | 0 Comments
Kelompok 1 Open GL
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.
21.40 | 0 Comments
Kelompok 1 Transformasi 3D
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;
21.25 | 0 Comments
kelompok 2 Program DDA & bresenham
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
03.26 | 0 Comments
Kelompok 2 program 3 dimensi
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
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
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
03.20 | 0 Comments
y0ut13t