GRAFIKA KOMPUTER 2D

BAB I
Software Untuk Grafika Komputer
Software untuk menggambar grafik pada komputer ada dua jenis yaitu software
yang bebentuk library atau pustaka pada suatu bahasa pemrograman(paket pemrograman
grafika) dan software yang berbentuk aplikasi khusus. Pada software yang berbentuk
library suatu bahasa pemrograman akan dilengkapi fungsi fungsi grafik yang berasal dari
paket software grafik tersebut yang termasuk contoh dari jenis ini adalah Open Gl yang
dibuat Silicon Graphics.


Sedang pada paket aplikasi khusus gambar grafik dibuat tanpa
mengetahui bagaiamanahal itu dapat terjadi, contoh dari jenis ini adalah Blender ataupun
Qcad. Pada Modul ini yang digunakan adalah software jenis pertama dengan
menggunakan fungsi grafik pada Bahasa Pemrograman Pascal.
Note: Semua kode pada modul ini menggunakan prosedur prosedur di
bawah. tambahkan pada setiap awal kode program!.
procedure init;
var gd, gm : integer;
begin
gm:=detect; gd:=0;
InitGraph(gd,gm,'');
if GraphResult <> grOk then
begin
Writeln('Graph driver ',gd,' graph mode ',gm,' not
supported');
Halt(1);
end;
end;
procedure destroy;
begin
closegraph;
end;

BAB II
Output Primitif
1. TITIK
Titik dalam Grafika Komputer bisa didefinisikan sebagai suatu posisi tertentu dalam
suatu sistem koordinat. Sistem koordinat yang dipakai bisa Polar Coordinates atau
Cartesian Coordinates. Biasanya dalam pemrograman grafis, yang paling umum
digunakan adalah Cartesian Coordinates.
Dalam Cartesian Coordinates, titik didefinisikan sebagai kombinasi dua bilangan yang
menentukan posisi tersebut dalam koordinat x dan y (2D)
Contoh Penerapan
Jika kita ingin menempatkan titik­titik A(2,4), B(1,1), C(4,­1.5), D(­4,­2), E(–4,3)
Kita bisa menggambarkan sebagai berikut:
A
B
C D
E
GAMBAR 1 : TITIK DALAM CARTESIAN COORDINATESAda 2 definisi
koordinat dalam komputer terutama dalam Sistem Operasi Windows, yaitu Screen
Coordinate, dan Cartesian Coordinate, keduanya sering membingungkan. Untuk lebih
jelasnya mari kita lihat gambar berikut:S creen Coordinat es
Car t esian Coordinat es
X
Y
Y
X
GAMBAR 2 : PERBEDAAN SCREEN DAN CARTESIAN COORDINATES
Prinsipnya, karena monitor didesain untuk menggambar dari atas ke bawah, maka sumbu
y pada Screen Coordinates dan Cartesian Coordinates berbeda arah, untuk Screen
Coordinates, sumbu Y arahnya ke bawah, sedangkan pada Cartesian Coordinates, sumbu
Y arahnya ke atas. Biasanya dalam rendering pipeline, hal yang terakhir dilakukan
adalah mengkonversi Cartesian Coordinates ke Screen Coordinates.
Dalam Sistem Operasi Linux, koordinat yang dipakai antara Cartesian dan Screen sama,
yaitu Y positif ke atas.
Untuk koordinate 3D, sama dengan 2D, hanya saja ditambah 1 sumbu yaitu sumbu z
(axis­z). Ada beberapa cara untuk menggambarkan sumbu X, Y dan Z, ini. Pertama
dengan sumbu z mengarah ke atas(gambar 3).
X
Y
Z
GAMBAR 3 : KOORDINAT DENGAN Z MENGARAH KE ATAS
dan koordinat dengan koordinat y mengarak ke atas.X
Y
Z
X
Z
Y
GAMBAR 4 : KOORDINAT DENGAN Y MENGARAH KE ATAS
2. Garis
Umumnya persamaan garis lurus pada koordinat kartesius diwujudkan dalam
persamaan garis : y=m.x+b
jika dimisalkan pada dua titik(x0,y0 dan x1,y1) akan dibuat sebuah garis lurus, kita dapat
menentukan nilai “m' dan “b” dengan persamaan berikut:
y1­y0
m= ______
x1­x0
b=y1­m.x1
algoritma untuk menggambar garis pada komputer didasarkan pada dua persamaan di
atas. dimana m adalah gradien atau kemiringan garis tersebut.
1. Algoritma digital differential analyzer(DDA),
Prinsip algoritma ini adalah mengambil nilai integer terdekat dengan jalur garis
berdasarkan atas sebuah titik yang telah ditentukan sebelumnya(titik awal garis).
Algoritma pembentukan garis DDA:
1. Tentukan dua titik yang akan dihubungkan dalam pembentukan garis.
2. Tentukan salah satu titik sebagai awal(x0,y0) dan titik akhir(x1,y1).
3. Hitung dx=x1­x0, dan dy= y1­y0.4. Tentukan langkah, yaitu dengan cara jarak maksimum jumlah penambahan nilai
x maupun nilai y, dengan cara:
­Bila nilai absolut dari dx lebih besar dari absolut dy, maka langkah= absolut
dari dx.
­Bila tidak maka langkah= absolutdari dy
5. Hitung penambahan koordinat pixel yaitu x_increment=dx/langkah, dan
y_increment=dy/langkah
6. Koordinat selanjutnya (x+x_increment, y+y_increment)
7. Posisi pixel pada layar ditentukan dengan pembulatan nilai koordinat tersebut.
8. Ulangi nomor 6 dan 7 untuk menentukan posisi pixel selanjutnya,sampai x=x1
dan y=y1.
Contoh Prosedur DDA dalam pascal:
uses graph,crt;
{tambahkan pada bagian ini prosedur penginisialisasian device,
lihat pada bab 1}
procedure drawLine(xstart,ystart,xend,yend:integer);
var
step,k:integer;
dx,dy:real;
x_inc,y_inc,x,y:real;
begin
dx:=xend-xstart;
dy:=yend-ystart;
x:=xstart;
y:=ystart;
if abs(dx) > abs(dy) then
step:=round(abs(dx))
else
step:=round(abs(dy));
x_inc:=dx/step;
y_inc:=dy/step;
putPixel(round(x),round(y),30);
for k:=1 to step dobegin
x:=x+x_inc;
y:=y+y_inc;
putPixel(round(x),round(y),30);
end;
end;
begin
init;
{menggambar garis dari titik 10,10 ke 500,10}
drawLine(10,10,500,10);
readkey;
destroy;
end.
2. Algoritma garis Bressenham
Tidak seperti Algoritma DDA, Algoritma Bressenham tidak membulatkan nilai
posisi pixel setiap waktu. Algoritma Bressenham hanya menggunakan
penambahan nilai integer yang juga dapat diadaptasi untuk menggambar
lingkaran.
Berikut ini langkah langkah untuk membentuk garis menurut algoritma
Bressenham:
1. Tentukan dua titik yang akan dihubungkan
2. Tentukan salah satu titik di sebelah kiri sebagai titik awal yaitu(x0,y0) dan
titik lainnya sebagai titik akhir(x1,y1).
3. Hitung dx,dy,2dx dan 2dy­2dx.
4. Hitung parameter
p0=2dy­dx
5. Untuk setiap xk sepanjang jalur garis, dimulai dengan k=0,
­ Bila pk < 1="pk+2dy­" 1="pk+2dy­" x="x1" y="y1."> xb then
begin
x:=xb;
y:=yb;
xEnd:=xa;
end
else
begin
x:=xa;
y:=ya;
xEnd:=xb;
end;
putPixel(round(x),round(y),30);
while x < y2="R2." x="0" x="R/√2," p0="5/4­r" k="0," 1="Pk+2xk+1+1" 1="Pk+2xk+1+1­" 1="2xk+2" x="x+xcy=">=y
Contoh algoritma lingkaran midpoint
Untuk menggambarkan algoritma Bressenham dalam pembentukan suatu
lingkaran dengan titik pusat (0,0) dan radius 10, perhitungan berdasarkan pada oktan dari
kuadran pertama di mana x=0 sampai x=y. Nilai parameter dapat ditentukan dengan
P0=1­r =1­10=­9
Koordinat titk awal adalah(x,r)=(0,8).
K Pk (Xk+1,Yk+1) oktan­1
(0,8)
0 ­7 (1,8)
1 ­4 (2,8)
2 1 (3,7)
3 ­6 (4,7)
4 3 (5.6)
5 2 (6,5)
Prosedur algoritma lingkaran midpoint
Input yang digunakan pada prosedur ini adalah koordinat titik pusat dan radius
lingkaran. Posisi pixel ditentukan dengan rutin setPixel.
uses graph,crt;
{tambahkan pada bagian ini prosedur penginisialisasian device,
lihat pada bab 1}
procedure circlePlotPoints(xCenter,yCenter,x,y:integer);
begin
putPixel(xCenter+x, yCenter+y,30);
putPixel(xCenter-x, yCenter+y,30);
putPixel(xCenter+x, yCenter-y,30);putPixel(xCenter-x, yCenter-y,30);
putPixel(xCenter+y, yCenter+x,30);
putPixel(xCenter-y, yCenter+x,30);
putPixel(xCenter+y, yCenter-x,30);
putPixel(xCenter-y, yCenter-x,30);
end;
procedure circleMidPoint (xCenter,yCenter,radius:integer);
var
x,y,p:integer;
begin
x:=0;
y:=radius;
p:=1-radius;
circlePlotpoints(xCenter,yCenter,x,y);
while x<0 d2="konstan" 2="konstan" 2="1" penambahan="" dilakukan="" kecil="" sumbu="" digunakan="" bermacam="" macam="" pertama="" searah="" jam="" sepanjang="" jalur="" kuadran="" pergeseran="" slope="" alternatif="" dimulai="" seleksi="" titik="" berlawanan="" arah="" jarum="" penggeseran="" y="" ke="" unit="" step="" x="" pada="" saat="" kemiringan="" lebih="" besar="" dari="" dengan="" prosesor="" pixel="" dapat="" dihitung="" dalam="" dua="" bagian="" sekaligus="" pembentukan="" menurut="" algoritma="" circle="" midpoint="" ry="" dan="" pusat="" elips="" kemudian="" diperoleh="" hitung="" parameter="" p10="ry" 1="" 4="" rx="" 2="" tentukan="" nilai="" awal="" k="0," untuk="" setiap="" posisi="" xk="" berlaku="" sebagai="" berikut="" bila="" p1k="">< 1="p1k+2ry" 1="p1k+2ry" 1="2ry" 1="2rx">= 2rx
2
y
4. Tentukan nilai parameter pada bagian kedua menggunakan titik terakhir (x0,y0)
yang telah dihitung pada bagian pertama, sebagai berikut
P2
k+1=2ry
2
(xo+1/2)
2
+2rx
2
(yo­1)
2
­ rx
2
ry
2
5. Setiap posisi yk pada bagian kedua, dimulai dengan k=0
­ Bila p2k> 0 maka titik selanjutnya adalah (xk, yk­1)
p2k+1=p2k+2rx
2
yk+1+rx
2
­ Bila tidak, maka titik selanjutnya adalah (xk+1,yk­1) dan
p2k+1=pk+2ry
2
xk+1­2rx yk+1+ry
2
6. Tentukan titik simetris pada ketiga kuadran lainnya7. Gerakkan setiap posisi(x,y) pada garis melingkar dari elisp dengan titik
pusat(xc,yc) dan tentukan nilai koordinat
x=x+xc y=y+yc
8. Ulangi langkah untuk bagian pertama di atas, sehingga 2ry
2
x >= 2rx
2
y
Contoh algoritma elips Midpoint
Untuk menggambarkan algoritma midpoint dalam pembentukan elips dengan titik
pusat(0,0) dan mayor axis rx=6, serta minor axis ry=8, perhitungan berdasarkan pada
kuadran pertama sebagai berikut:, nilai parameter dapat ditentukan
2ry
2
x=0
2ry
2
x=2rx
2
ry
p1o= ry
2
+ rx
2
ry ­1/4 rx
2
=­215
Koordinat titik awal (x,r) =(0,8)
K Pk (Xk+1,Yk+1) oktan­1
(0,8)
0 ­215 (1,8)
1 ­23 (2,8)
2 297 (3,7)
3 241 (4,6)
4 ­108 (5.5)
5 236 (5,4)
6 ­16 (6,3)
7 600 (6,2)
8 492 (6,1)
9 456 (6,0)
Prosedur algoritma elips MidpointProsedur berikut menampilkan posisi pixel pada monitor dengan algorima
Midpoint. Input yang digunakan adalah koordinat titik pusat mayor axis, dan minor axis.
Posisi pixel ditentukan dengan rutin setPixel.
uses graph,crt;
{tambahkan pada bagian ini prosedur penginisialisasian device,
lihat pada bab 1}
procedure elipsPlotPoints(xCenter,yCenter,x,y:integer);
begin
putPixel(xCenter+x, yCenter+y,30);
putPixel(xCenter-x, yCenter+y,30);
putPixel(xCenter+x, yCenter-y,30);
putPixel(xCenter-x, yCenter-y,30);
end;
procedure elipsMidPoint(xCenter,yCenter,Rx, Ry:integer);
var
Rx2,Ry2,x,y,twoRx2,twoRy2,py,px,p:integer;
begin
Rx2:=Rx*Rx;
Ry2:=Ry*Ry;
x:=0;
y:=Ry;
twoRx2:=2*Rx2;
twoRy2:=2*Ry2;
px:=0;
py:=twoRx2*y;
elipsPlotPoints(xCenter,yCenter,x,y);
//bagian1
p:=round(Ry2-(Rx2*Ry)+(0.25*Rx2));
while px<0>0 do
begin
y:=y-1;
py:=py-twoRx2;
if p>0 then
p:=p+(Rx2-py)
else
begin
x:=x+1;
px:=px+twoRy2;
p:=p+Ry2+px-py;
end;
elipsPlotPoints(xCenter,yCenter,x,y);
end;
end;
begin
init;
elipsMidPoint(130,120,120,190);
readkey;
destroy;
end.
6. Fill area primitive
Terdapat dua dasar pendekatan untuk mengisi area pada raster system. Pertama,
menentukan overlap internal untuk scan line yang melintasi area. Metode lain yaitu
dengan memulai dari titik tertentu pada posisi di dalam polygon dan menggambar
dengan arah menyebar ke pinggir, sampai batas polygon.
1. Algoritma scan line Titik potong diurutkan dari kiri ke kanan. Posisi yang berhubungan pada
frame buffer antara sepasang titik potong diberi warna tertentu. Posisi empat
pixel sebagai titik potong antara garis batas polygon ditentukan oleh dua buah
pixel pada koordinat darri x=8 ke x=13 dan dari x=23 ke x=34
2. Algoritma boundary fill.
Metode ini bermanfaat untuk paket aplikasi grafik interaktif dimana titik
dalam dapat dengan mudah ditentukan. Prosedur boundary fill menerima inout
koordinat suatu titik(x,y), warna isi dan garis batas. Dimulai dari titik (x,y),
prosedur memeriksa posisi titik tetangga, yaitu apakah merupakan warna batas.
Bila tidak, maka titik tersebut digambar dengan warna isi. Proses ini dilanjutkan
sampai semua titik pada batas diperiksa. Prosedur berikut menampilkan metode
rekursif mengisi 4 bidang dengan intensitas pada parameter fill.
procedure boundaryFil( x,y,fill,boundary:integer);
var
current:integer;
begin
current:= getPixel(x,y);
if (current <> boundary) and (current <> fill) then
begin
putPixel(x,y,fill);
boundaryFill(x+1,y,fill,boundary);
boundaryFill(x-1,y,fill,boundary);
boundaryFill(x,y+1,fill,boundary);
boundaryFill(x,y-1,fill,boundary);
end;
end;
3. Algoritma flood fill
Pendekatan lain untuk mengisi suatu bidang polygon adalah algorima
flood fill. Metode ini dimulai pada titik (x,y) dan mendefinisikan seluruh pixel
pada bidang tersebut dengan warna yang sama. Bila bidang yang akan diisi warna memiliki beberapa warna. Pertama tama yang dibuata adalah membuat
nilai pixel baru, sehingga smua pixel memiliki warna yang sama. Prosedur
berikut menggambarkan metode flood­fill untuk mengisi warna suatu polygon.
procedure floodFill( x,y,fillColor,oldColor:integer);
begin
if getPixel(x,y) = oldcolor then
begin
putPixel(x,y,fillcolor);
floodFill(x+1,y , fillColor, oldColor);
floodFill(x-1,y , fillColor, oldColor);
floodFill(x,y+1 , fillColor, oldColor);
floodFill(x,y-1 , fillColor, oldColor);
end;
end;BAB III
Transformasi Dua Dimensi
1 Transformasi Dasar
a. Translasi
Translasi dilakukan dengan penambahan translasi pada suatu titik koordinat dengan
translation vector atau shift vector, yaitu(tx, ty). Koordinat baru titik yang ditranslasi
dapat diperoleh dengan menggunakan rumus
x’ = x +tx
y’ = y+ty
translasi adalah transfomasi dengan bentuk yang tetap memindahkan objek apa adanya.
Titik yang akan ditranslasi akan dipindahkan ke lokasi lain menurut garis lurus.
Contoh Translasi
Untuk menggambarkan translasi suatu objek yang berupa segitiga dengan koordinat
A(10,10), B(30,10), dan C(10,30) dengan translation vector (10,20), pertama tama
dihitung koordinat hasil translasi
Titik A
x’A = xA + tx = 10+10 = 20
y’A = yA + ty = 10+20 = 30
Hasil translasi titik A’(20,30)
Titik B
x’B = xB + tx = 30+10 = 40
y’B = yB + ty = 10+20 = 30
Hasil translasi titik B’(40,30)
Titik C
x’C = xC + tx = 10+10 = 20y’C = yC + ty = 30+20 = 50
Hasil translasi titik C’(20,50)
Dengan demikian hasil translasi segitiga dengan koordinat A’(20,30) B’(40,30)
C’(20,50). Segitiga yang baru sama bentuknya dengan segitiga yang lama.
Contoh Program translasi garis (10,10,500,10) dengan vector translasi 20,10
uses graph,crt;
var
x0,y0,x1,y1:integer;
{tambahkan pada bagian ini prosedur penginisialisasian device, lihat
pada bab 1}
procedure drawLine(xstart,ystart,xend,yend:integer);
var
step,k:integer;
dx,dy:real;
x_inc,y_inc,x,y:real;
begin
dx:=xend-xstart;
dy:=yend-ystart;
x:=xstart;
y:=ystart;
if abs(dx) > abs(dy) then
step:=round(abs(dx))
else
step:=round(abs(dy));
x_inc:=dx/step;
y_inc:=dy/step;
putPixel(round(x),round(y),30);
for k:=1 to step do
begin
x:=x+x_inc;
y:=y+y_inc;
putPixel(round(x),round(y),30);
end;
end;procedure transLine(xstart,ystart,xend,yend,xtrans,ytrans:integer; var
xstartout,ystartout,xendout,yendout:integer);
begin
xstartout:=xstart+xtrans;
ystartout:=ystart+ytrans;
xendout:=xend+xtrans;
yendout:=yend+ytrans;
end;
begin
init;
{menggambar garis dari titik 10,10 ke 500,10}
drawLine(10,10,500,10);
transLine(10,10,500,10,20,10,x0,y0,x1,y1);
drawLine(x0,y0,x1,y1);
readkey;
destroy;
end.
Penskalaan
Transformasi skala adalah perubahan ukuran suatu objek. Koordinat baru diperoleh
dengan melakukan perkalian koordinat dengan ascling factor, yaitu(sx,sy) dimana sx
adalh scaling facor untuk sumbu x dam sy adalah scaling factor untuk sumbu y. koordinat
baru titik yang diskala dapat diperoleh dengan
x’ = x.sx
y’= y.sy
scaling factor sx dan sy dapat diberikan sembarang nilai positif. Nilai lebih dari 1
menandakan bahwa sebuah objek diperbesar sedang nilai nilai kurang dari 1
menunjukkan bahwa objek diperkecil.
Contoh penskalaan
Untuk menggambarkan skala suatu objek yang merupakan segiempat dengan
koordinat A(10,10), B(30,10), C(30,20), D(10,20) diskala dengan scaling factor(3,2), pertama tama dihitung koordinat hasil skala satu demi satu, pertama tama dihitung
koordinat hasil skala satu demi satu
Titik A
x’A = xA.sx= 10* 3 =30
y’A = yA.sy=10 * 2=20
Hasil skala titik A’(30,20)
Titik B
x’B = xB.sx= 30* 3 =90
y’B = yB.sy=10 * 2=20
Hasil skala titik B’(90,20)
Titik C
x’C = xC.sx= 30* 3 =90
y’C = yC.sy=20 * 2=40
Hasil skala titik C’(90,40)
Titik D
x’D = xD.sx= 10* 3 =30
y’D = yD.sy=20 * 2=40
Hasil skala titik D’(30,40)
Skala dengan fixed point
Lokasi skala suatu objek dapat dikontrol dengan menentukan titik tertentu
yang disebut fixed point(xf,yf). Koordinat fixed point dapat dapat pada
sembarang posisi. Poligon kemudian diskala relative terhadap fixed point dengan
melakukan skala jarak dari tiap titik terhadap fixed point.Untuk titik dengan
koordinat (x,y) diperoleh(x’,y’) sebagai skala
x’=xf+(x­xf)sx
y’=yf+(y­yf)syContoh Program penskalaan garis (10,10,50,10) dengan skala 2
uses graph,crt;
var
x0,y0,x1,y1:integer;
{tambahkan pada bagian ini prosedur penginisialisasian device,
lihat pada bab 1}
procedure drawLine(xstart,ystart,xend,yend:integer);
var
step,k:integer;
dx,dy:real;
x_inc,y_inc,x,y:real;
begin
dx:=xend-xstart;
dy:=yend-ystart;
x:=xstart;
y:=ystart;
if abs(dx) > abs(dy) then
step:=round(abs(dx))
else
step:=round(abs(dy));
x_inc:=dx/step;
y_inc:=dy/step;
putPixel(round(x),round(y),30);
for k:=1 to step do
begin
x:=x+x_inc;
y:=y+y_inc;
putPixel(round(x),round(y),30);
end;
end;
procedure scaleLine(xstart,ystart,xend,yend,scale:integer; var
xstartout,ystartout,xendout,yendout:integer);
begin
xstartout:=xstart*scale;
ystartout:=ystart*scale;
xendout:=xend*scale;
yendout:=yend*scale;
end;begin
init;
drawLine(10,10,50,10);
scaleLine(10,10,50,10,2,x0,y0,x1,y1);
drawLine(x0,y0,x1,y1);
readkey;
destroy;
end.
Rotasi
Rotasi dua dimensi memindahkan sebuah objek menurut garis melingkar. Untuk
melakukan rotasi diperlukan sudut rotasi a’ dan pivot point(xp,yp). Nilai positif dari
sudut rotasi menentukan arah rotasi berlawanana dengan arah jarum jam. Sedangkan
sudut rotasi negative memutar objek searah dengan jarum jam.
Rumus transformasi untuk rotasi suatu titik(x,y) dengan sudut rotasi a sebagai
berikut:
x’= x cos a­y sin a
y’= y sina+y cos a
Contoh Rotasi
Untuk menggambarkan rotasi suatu objek yang berupa segitiga dengan koordinat
A(10,10), B(30,10), dan C(10,30) dengan sudut rotasi 30’ terhadap titik pusat koordinat
Cartesian (10,10), dilakukan dengan menghitung koordinat hasil rotasi tiap titik satu demi
satu.
Titik A
x’A = xp+(xA­xp) cos 30’ – (yA­yp)sin 30’
=10+(10­10)* 0.9 –(10­10) *0.5=10
y’A = yp+(xA­xp) sin 30’ – (yA­yp)cos 30’
=10+(10­10)*0.5 +(10­10)*0.9=10
Hasil rotasi titik A’(10,10)Titik B
x’B = xp+(xB­xp) cos 30’ – (yB­yp)sin 30’
=10+(30­10)* 0.9 –(10­10) *0.5=28
y’B = yp+(xB­xp) sin 30’ – (yB­yp)cos 30’
=10+(30­10)*0.5 +(10­10)*0.9=20
Hasil rotasi titik A’(28,20)
Titik C
x’C = xp+(xC­xp) cos 30’ – (yC­yp)sin 30’
=10+(10­10)* 0.9 –(30­10) *0.5=0
y’C = yp+(xC­xp) sin 30’ – (yC­yp)cos 30’
=10+(10­10)*0.5 +(30­10)*0.9=28
Hasil rotasi titik A’(0,28)
contoh program merotasi garis dengan pusat rotasi 40,50 dan sudut rotasi 180'
uses graph,crt;
var
x0,y0,x1,y1:integer;
{tambahkan pada bagian ini prosedur penginisialisasian device, lihat
pada bab 1}
procedure drawLine(xstart,ystart,xend,yend:integer);
var
step,k:integer;
dx,dy:real;
x_inc,y_inc,x,y:real;
begin
dx:=xend-xstart;
dy:=yend-ystart;
x:=xstart;
y:=ystart;
if abs(dx) > abs(dy) then
step:=round(abs(dx))
else
step:=round(abs(dy));x_inc:=dx/step;
y_inc:=dy/step;
putPixel(round(x),round(y),30);
for k:=1 to step do
begin
x:=x+x_inc;
y:=y+y_inc;
putPixel(round(x),round(y),30);
end;
end;
procedure
rotateLine(xstart,ystart,xend,yend,xcenter,ycenter:integer;angle:real;
var xstartout,ystartout,xendout,yendout:integer);
begin
xstartout:=round((xcenter+((xstart-xcenter)*cos(angle)))-((ystart-
ycenter)*sin(angle)));
ystartout:=round((ycenter+((xstart-xcenter)*sin(angle)))-((ystart-
ycenter)*cos(angle)));
xendout:=round((xcenter+((xend-xcenter)*cos(angle)))-((yend-
ycenter)*sin(angle)));
yendout:=round((ycenter+((xend-xcenter)*sin(angle)))-((yend-
ycenter)*cos(angle)));
end;
begin
init;
drawLine(10,10,50,10);
rotateLine(10,10,50,10,40,50,180,x0,y0,x1,y1);
drawLine(x0,y0,x1,y1);
readkey;
destroy;
end.
Refleksi
Refleksi adalah transfomasi membuat mirror dari suatu objek. Objek hasil
refleksi dibuat relatif terhadap sumbu dari refleksi dengan memutar 180' terhadap sumbu
refleksi. Sumbu refleksi dapat dipilih pada bidang xy. Jenis jenis refleksi ada berbagai macam tetapi algoritma yang digunakan semua sama tinggal mengubah matriks
transfomasinya saja.
Contoh refleksi terhadap sumbu y=0.
uses graph,crt;
var
x0,y0,x1,y1:integer;
result: array [1..1,1..3] of integer;
matTrans:array [1..3,1..3] of integer;
before: array [1..3,1..3] of integer;
{tambahkan pada bagian ini prosedur penginisialisasian device, lihat
pada bab 1}
procedure drawLine(xstart,ystart,xend,yend:integer);
var
step,k:integer;
dx,dy:real;
x_inc,y_inc,x,y:real;
begin
dx:=xend-xstart;
dy:=yend-ystart;
x:=xstart;
y:=ystart;
if abs(dx) > abs(dy) then
step:=round(abs(dx))
else
step:=round(abs(dy));
x_inc:=dx/step;
y_inc:=dy/step;
putPixel(round(x),round(y),30);
for k:=1 to step do
begin
x:=x+x_inc;
y:=y+y_inc;
putPixel(round(x),round(y),30);
end;
end;
procedure initMatrix;var
i,j:integer;
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
if i=j then
matTrans[i,j]:=1
else
matTrans[i,j]:=0;
end;
matTrans[3,3]:=-1;
end;
procedure calculateMatrix(xstart,ystart:integer; var
xstartout,ystartout:integer);
var
i,j,k,jumlah:integer;
begin
initMatrix;
before[1,1]:=xstart;
before[1,2]:=ystart;
before[1,3]:=1;
for i:=1 to 3 do
for j:=1 to 3 do
begin
jumlah:=0;
for k:=1 to 3 do
begin
result[i,j]:=jumlah+(matTrans[i,k]*before[k,j]);
end;
end;
xstartout:=result[1,1];
ystartout:=result[1,2];
end;
procedure reflectLine(xstart,ystart,xend,yend:integer; var
xstartout,ystartout,xendout,yendout:integer);begin
calculateMatrix(xstart,ystart,xstartout,ystartout);
calculateMatrix(xend,yend,xendout,yendout);
end;
begin
init;
{menggambar garis dari titik 10,10 ke 500,10}
drawLine(10,10,500,10);
reflectLine(10,10,500,10,x0,y0,x1,y1);
drawLine(x0,y0,x1,y1);
readkey;
destroy;
end.BAB IV
Clipping Titik dan Garis
Clipping adalah pendefinisan gambar di dalam maupun di luar suatu bidang
tertentu. Clipping dapat diaplikasikan pada world coordinate, sehingga hanya isi yang
berada dalam window dipetakan ke device coordinate. Cara lain, world coordinate
lengkap dapat dipetakan ke device coordinate lebih dahulu, kemudian di clip pada batas
viewport.
1. Clipping titik
Pada clip window yang berbentuk segi empat, titik )x,y) akan ditampilkan bila
xwmin <= x <=xwmax ywmin <= y <=ywmax dimana batas clip window(xwmin,xwmax,ywmin,ywmax) dapat berada di dalam batas world coordinate atau viewport coordinate. Bila salah satu tidak terpenuhi maka titik tersebut tidak akan diclip. Contoh Algoritma Clipping titik uses graph,crt; var x,y,xmin,ymin,xmax,ymax:integer; jawab:char; {tambahkan pada bagian ini prosedur penginisialisasian device, lihat pada bab 1} procedure clipPoint(x,y,xmin,ymin,xmax,ymax:integer); begin if (x>=xmin) and (x<=xmax) and (y>=ymin) and (y<=ymax) then begin init; putPixel(x,y,30); readkey; destroy; endelse writeln('Point is not visible'); end; begin jawab:='n'; while jawab = 'n' do begin writeln('enter the coordinates of clipping window '); writeln('enter x(min) y(min)'); read(xmin); readln(ymin); writeln('enter x(max) y(max)'); read(xmax); readln(ymax); writeln('enter the coordinates of point x y'); read(x); readln(y); clipPoint(x,y,xmin,ymin,xmax,ymax); writeln('do yo want to exit (y/n)'); readln(jawab); end end. 2. Clipping Garis Gambar di atas memprlihatkan hubungan antara posisi garis dengan viewport. Bagian bagian garis yang berada di luar viewport tidak akan ditampilkan. Berikut ini algoritma clipping garis yang palibg sering digunakan: 1. Periksa segmen garis untuk menentukan sepenuhnya berada di dalam clip window. 2. Bila tidak, maka dicoba untuk menentukan apakah sepenuhnya di luar window. 3. Bila tidak dapat mengidentifikasi sepenuhnya di dalam, ataupun di luar window, maka dilakukan perhitungan perpotongan dengan satu atau lebih batas clipping. Clipping garis Cohen­SutherlandAlgoritma Cohen­Sutherland merupakan algoritma yang paling populer. Biasanya metode ini mempercepat pemrosesan segmen garis dengan mengurangi jumlah perpotongan yang harus dihitung. Setiap endpoint dari garis dalam suatu gambar dinyatakan dalam 4 digit kode biner yang disebut region code, yang mengidentifikasikan lokasi dari titik relatif terhadap batas clipping yang berbentuk segi empat. Contoh Prosedur Clipping garis Cohen­Sutherland uses graph,crt; var pixels:array[0..1,0..3] of integer; x1,y1,x2,y2,xmin,ymin,xmax,ymax:integer; xn1,xn2,yn1,yn2,m:real; jawab:char; {tambahkan pada bagian ini prosedur penginisialisasian device, lihat pada bab 1} procedure DrawBressLine(xa,ya,xb,yb:integer); var dx,p,dy,xEnd:integer; x,y:real; begin dx:= abs(xb-xa); dy:= abs(yb-ya); p:=2*dy-dx; if xa > xb then
begin
x:=xb;
y:=yb;
xEnd:=xa;
end
else
begin
x:=xa;
y:=ya;
xEnd:=xb;
end;putPixel(round(x),round(y),30);
while x <> ymax then
pixels[0,0]:=1;
if y1xmax then
pixels[0,2]:=1;
if x1ymax then
pixels[1,0]:=1;
if y2xmax then
pixels[1,2]:=1;
if x2 xb then
begin
x:=xb;
y:=yb;
xEnd:=xa;
end
else
begin
x:=xa;
y:=ya;
xEnd:=xb;
end;
putPixel(round(x),round(y),30);
while x <> 0 then
begin
if q < (tL * d ) then clipt:= false; if q < (tU * d ) then tU := q / d; end else if q <> 0 then
begin
x1 := x1+(tL * dx);
y1 := y1+(tL * dy);
end;
DrawBressLine(round(x1),round(y1),round(x2),round(y2));
end;
end;
end;
end;
end;
begin
jawab:='n';
while jawab = 'n' do
begin
writeln('enter the coordinates of clipping window ');
writeln('enter x(min) y(min)');
read(xmin);
readln(ymin);
writeln('enter x(max) y(max)');
read(xmax);
readln(ymax);
writeln('enter the coordinates of line');
writeln('enter X1 Y1');
read(x1);
readln(y1);
writeln('enter X2 Y2');
read(x2);
readln(y2);init;
DrawBressLine(round(x1),round(y1),round(x2),round(y2));
readkey;
destroy;
init;
liang_barsky_line(x1,y1,x2,y2);
readkey;
destroy;
writeln('do yo want to exit (y/n)');
readln(jawab);
end;


1 komentar:

Blashz mengatakan...

thanks gan
jual madu hutan asli
citra indah

Posting Komentar

Template by : kendhin x-template.blogspot.com