Rabu, 11 Juli 2012
Tugas PKG
Dalam pembuatan 3 garis dalam open gl. pertama - tama kita harus menggambar garis pertama dlu di mulai dari sumbu ( 0,0 ) titik tengah.
1. glTranslatef(0,0,0)
glRotatef(0,0,0,01)
Line(0,0,20,0)
Beri nilai 20 untuk garis dasar 20 karakter ke kanan.ini untuk membentuk garis pertama.
2. glTranslatef(20,0,0)
glRotatef(0,0,0,01)
Line(0,0,20,0)
Bangun garis kedua sama pengerjaan nya seperti no. 1, bedanya glTranslatefnya kita beri nilai 20, agar garis pertama bergeser 20 karakter ke kanan.
3. glTranslatef(20,0,0)
glRotatef(0,0,0,01)
Line(0,0,20,0)
ini garis ketiga yg kita bangun, pengerjaan nya sama seperti soal nomer 2. langkahnya pun sama seperti nomer 2.
Jadi sekarang kita sudah mempunyai 3 garis mendatar, yang masing-masing mempunyai panjang 20 karakter. Untuk membentuk garis menjadi contoh yang kita inginkan, kita harus merotasi garis pertama sebesar 45derajat.
1. glTranslatef(0,0,0)
glRotatef(45,0,0,01)
Line(0,0,20,0)
glRotatef nya kita beri 45, jadi semua garis akan berotasi sebesar 45derajat.
Ulangi dengan memberikan nilai 45 pada 2 perintah lainnya. sehingga kita dapatkan pola garis yang kita inginkan. ^_^
berikut script lengkap nya :
sub Line(x0#,y0#,x1#,y1#)
glBegin(GL_LINES)
glcolor3f(1.0,1.0,1.0) : glcolor3f(1.0,1.0,1.0)
glvertex2f(x0#,y0#) : glvertex2f(x1#,y1#)
glEnd()
end sub
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT) ' Clear The Screen And The Depth Buffer
glLoadIdentity() ' Reset The View
glTranslatef(0.0,0.0,-100.0)
glTranslatef(0,0,0)
glRotatef(45,0,0,01)
Line(0,0,20,0)
glTranslatef(20,0,0)
glRotatef(45,0,0,01)
Line(0,0,20,0)
glTranslatef(20,0,0)
glRotatef(45,0,0,01)
Line(0,0,20,0)
SwapBuffers ()
berikut link download untuk 3 garis :download
berikut link download untuk 3 kotak : download
berikut link download untuk rotasi planet : download
kelompok : http://razztya.blogspot.com
1. Yudha Prasetya
2. Idah Wahyuni
3. Moch. Triyoga
Selasa, 03 April 2012
Algoritma DDA Elips
Algoritma Pembentukan Elips
Elips
merupakan modifikasi dari bentuk lingkaran, dengan memasukkan mayor dan
minor axis pada prosedur lingkaran. Elips ditentukan oleh satu set
titik dengan memperhitungkan jumlah jarak kedua posisi (foci). Bila
jarak kedua foci dari sembarang titik (p,y) pada elips diberi label d1
dan d2, maka persamaan elips menjadi
d1+d2=konstan
Untuk menggambarkan jarak d1 dan d2 dengan ketentuan koordinat masing masing
F1(x1,y1) dan F2(X2,Y2)
√((xx1)2+(yy1)2)2+√((xx2)2+(yy2)2=konstan
Dimana
mayor dan minor axis elips dalam posisi parallel dengan sumbu x dan
sumbu y pada contoh ini, parameter rx disebut semi major axis dan ry
disebut semi minor axis, sehingga persamaan elips dengan parameter rx
dan ry menjadi
((xrc)/rx)2 + ((yyc)/ry)2=1
Algoritma elips Midpoint
Untuk algoritma pembentukan elips, pendekatan yang dilakukan sama dengan
penggunaan pada saat menampilkan lingkaran. Dengan parameter untuk elips pada posisi
standar, yaitu rx, ry, dan(xc,yc). Bila elips ditampilkan pada posisi standar, maka dapat
dilakukan dengan memutar elips tersebut menurun koordinat titik pusat, dan
mendapatkan kembali mayor dan minor axis.
Metode midpoint untuk elips dijalankan pada kuadran pertama dalam dua bagian.
Bagian pertama menrut kemiringan elips rx<ry. Penambahan dengan unit step pada arah
sumbu x dilakukan bila slope lebih kecil dari 1, dan dengan unit step menurut sumbu y
bila kemiringan lebih besar dari 1.
Bagian 1 dan 2 dapat digunakan untuk bermacam macam cara. Pertama dimulai
dari posisi (0,ry) dan step searah jarum jam sepanjang jalur elips pada kuadran pertama.
Pergeseran dengan unit step dalam x pada saat slope lebih besar dari 1.
Alternatif lain, dimulai dari (rx,0) dan seleksi titik dalam arah berlawanan dengan
arah jarum jam. Penggeseran unit step y ke unit step x pada saat kemiringan lebih besar
dari 1. dengan prosesor pararel, posisi pixel dapat dihitung dalam dua bagian sekaligus
Pembentukan elips menurut algoritma Circle midpoint sebagai berikut:
1) Tentukan rx,ry dan pusat elips (xc,yc) kemudian diperoleh
(xo,yo)=(0,ry)
2) Hitung nilai parameter
P10= ry2 –rx ry2 + ¼ rx2
3) Tentukan nilai awal k=0, untuk setiap posisi xk berlaku sebagai berikut :
· Bila p1k< 0 maka titik selanjutnya adalah (xk+1, yk)
p1k+1=p1k+2ry2 Xk+1+ry2
· Bila tidak, maka titik selanjutnya adalah (xk+!,yk1) dan
p1k+1=p1k+2ry2 Xk+12rx yk+1+ry2
dengan
2ry2xk+1=2ry2xk +2ry2
Dan 2rx yk+1=2rx2 yk +2rx2
Teruskan sampai
2ry2x >= 2rx2 y
4) Tentukan nilai parameter pada bagian kedua menggunakan titik terakhir (x0,y0) yang
telah dihitung pada bagian pertama, sebagai berikut
P2k+1=2ry2 (xo+1/2)2+2rx2 (yo1)2 rx2 ry2
5) Setiap posisi yk pada bagian kedua, dimulai dengan k=0
· Bila p2k> 0 maka titik selanjutnya adalah (xk, yk1)
p2k+1=p2k+2rx2yk+1+rx2
· Bila tidak, maka titik selanjutnya adalah (xk+1,yk1) dan
p2k+1=pk+2ry2xk+12rx yk+1+ry2
6) Tentukan titik simetris pada ketiga kuadran lainnya
7) 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 2ry2x >= 2rx2 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
2ry2x=0
2ry2x=2rx2 ry
p1o= ry2 + rx2 ry 1/4 rx2
= 215
Prosedur algoritma elips Midpoint
Prosedur 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<py do
begin
x:=x+1;
px:=px+twoRy2;
if p<0 then
p:= p+(Ry2+px)
else
begin
y:=y-1;
py:=py-twoRx2;
p:=p+(Ry2+px-py);
end;
elipsPlotPoints(xCenter,yCenter,x,y);
end;
//bagian 2
p:=round(Ry2*(x+0.5) *(x+0.5)+Rx2*(y-1) *(y-1)-Rx2*Ry2);
while y>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.
5. 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 floodfill 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;
Algoritma DDA ( Lingkaran )
LINGKARAN BRESENHAM
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.
Pembuatan
suatu lingkaran merupakan salah satu primitive yang berperan dalam
grafika komputer. Prinsip yang dipakai pada penelitian ini dalam
pembuatan lingkaran adalah menterjemahkan dari bahasa matematika ke
dalam bahasa pemrograman untuk metode Bezier dan algoritma Bresenham.
Untuk program-program terapan sederhana, lingkaran yang diperoleh dari
bentuk dasar kurva cukup memadai, tetapi seringkali diinginginkan bentuk
lingkaran yang jauh lebih rumit dan tidak teratur. Bentuk fungsi
matematis yang paling utama untuk menggambar kurva sebagai dasar
pembuatan bentuk lingkaran adalah fungsi parametrik atau vector-valued
function yaitu untuk sembarang titik pada suatu permukaan, lokasinya
ditentukan oleh dua buah parameter u dan v biasanya bernilai antara 0
dan 1, dan fungsi parametrik x,y, dan z merupakan lokasi-lokasi titik
pada kurva atau permukaan. Algoritma de Casteljau [2] merupakan
algoritma untuk membuat kurva menggunakan sejumlah titik kontrol, dan
menggunakan teknik in-betweening untuk mendapatkan kurva yang
diinginkan. Algoritma ini dikembangkan oleh P. de Casteljau, dan
merupakan cikal bakal kurva Bezier, yang secara terpisah dikembangkan
lebih lanjut oleh P. Bezier. Algoritma de Casteljau untuk membuat kurva
Bezier cukup ampuh secara algoritmik, tetapi tidak secara eksplisit
menyatakan bentuk fungsionalnya. Karena alasan ini, kemudian
dikembangkan persamaan lain untuk membuat kurva Bezier, yang sangat
berguna untuk tujuan analisis.
Algoritma
Bresenham dipilih karena merupakan metode dasar grafis yang sangat
populer dan terkenal efisiensinya, Bresenham memakai dasar integer arithmetic yang jauh lebih cepat daripada floating-point arithmetic yang
biasa dipakai dan menggunakan suatu persamaan matematis untuk
mengetahui adanya baris atau kolom baru yang akan dibuat dalam proses
pembuatan suatu garis. Tetapi Bresenham juga memiliki kekurangan yaitu
timbulnya error jika dua segmen garis yang overlap dibuat, error juga
akan timbul jika sebuah segmen garis yang intensitasnya berbeda overlap
terhadap suatu segment garis yang sudah ada.
Algoritma
Bresenham menggunakan aritmatika integer yang tidak memerlukan
perkalian dan pembagian dalam proses perhitungannya didalam seluruh
implementasi, yang mana aritmatika integer ini memiliki kecepatan
perhitungan yang lebih tinggi daripada aritmatika floating point.
Algoritma Bresenham memberikan persamaan umum untuk lingkaran sebagai
berikut:
(X – a)2 + (Y – b)2 = R2
Dengan
(Xa,Ya) sebagai koordinat awal dan (Zt,Yt) sebagai koordinator akhir.
Persamaan umum lingkaran yang diberikan oleh Algoritma Bresenham di atas
diturunkan dari persamaan umum lingkaran :
X2 + Y2 = R2
Keterangan:
X = absis ³ 0
Y = ordinat ³ 0
R = bilangan integer ³ 1.
Pada
algoritma pembuatan lingkaran dengan arah penggambaran searah jarum
arah jarum jam untuk lintasan yang besarnya seperempat lingkaran atau 90˚ memiliki tiga titik perhitungan yaitu m1, m2, dan m3.
Gambar 6. Flowchart Procedure
Bresenham
Fungsi procedure dibawah ini sebagai algoritma utama Bresenham untuk menggambar lingkaran.
begin
x:=0;
y:=100;
xCenter:=150;
yCenter:=150;
plotpoints;
p:=1-y;
while x <>
begin
if p<0>
x:=x+1
else
begin
x:=x+1;
y:=y-1;
end;
if p<0>
p:=p+2*x+1;
else
p:=p+2*(x-y)+1;
plotpoints
end;
end;
Menggambar sebuah lingkaran dengan menggunakan delphi7
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
CheckBox1: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
findrawing:boolean;
fjari,xcenter, ycenter:integer;
procedure GambarLingkaran(r:integer);
procedure GambarTitik(xi, yi:integer);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.GambarTitik(xi,yi:integer);
var
x,y:Integer;
begin
x:=xcenter+xi;
y:=ycenter-yi;
canvas.pixels[x,y]:=clBlack;
//Deklarasi untuk view all
if checkbox1.checked then
begin
x:=xcenter-xi;
y:=ycenter-yi;
canvas.pixels[x,y]:=clBlack;
x:=xcenter-xi;
y:=ycenter+yi;
canvas.pixels[x,y]:=clBlack;
x:=xcenter+xi;
y:=ycenter+yi;
canvas.pixels[x,y]:=clBlack;
end;
end;
procedure TForm1.GambarLingkaran(r:integer);
var
d1, d2:Real;
xi, yi:integer;
mh, md, mv:integer;
begin
xi:=0;
yi:=R;
while yi > 0 do
begin
GambarTitik(xi, yi);
md:=abs(sqr(xi+1)+sqr(yi-1)-sqr(r));
mh:=abs(sqr(xi+1)+sqr(yi)-sqr(r));
mv:=abs(sqr(xi)+sqr(yi-1)-sqr(r));
d1:=sqr(xi+1)+sqr(yi-1)-sqr(r);
if d1<0>
begin
d2:=mh-md;
if d2<=0 then
begin
xi:=xi+1;
yi:=yi;
end
else
begin
xi:=xi+1;
yi:=yi-1;
end;
end
else if d1>0 then
begin
d2:=mv-md;
if d2<=0 then
begin
xi:=xi;
yi:=yi-1;
end
else
begin
xi:=xi+1;
yi:=yi-1;
end;
end
else if d1=0 then
begin
xi:=xi+1;
yi:=yi-1;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TRY
Canvas.FillRect(Rect(0, Panel1.Height,Width,Height));
xcenter:=width div 2;
ycenter:=height div 2;
GambarLingkaran(strtoint(edit1.Text));
EXCEPT
ShowMessage('ISI!');
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
xcenter:=x;
ycenter:=y;
findrawing:=true;
CheckBox1.Checked:=true;
//tentukan jari2 pertama sama dengan 10
fjari:=10;
//gunakan modus pen pmnotxor
Canvas.Pen.Mode:=pmNotXor;
//gambar lingkaran pertama
GambarLingkaran(fjari);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
dx,dy:integer;
begin
if findrawing then
begin
//hapus lingkaran sebelumnya
GambarLingkaran(fjari);
//hitung jari2 yang baru
dx:=abs(xcenter-x);
dy:=abs(ycenter-y);
if dx>dy then fjari:=dx else fjari:=dy;
//gambar lingkaran yang baru
GambarLingkaran(fjari);
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
dx,dy:integer;
begin
//hapus lingkaran sebelumnya
GambarLingkaran(fjari);
//selesai menggambar
findrawing:=false;
//ubah modus ke pmcopy
Canvas.Pen.Mode:=pmCopy;
//hitung jari2 yang baru
dx:=abs(xcenter-x);
dy:=abs(ycenter-y);
if dx>dy then fjari:=dx else fjari:=dy;
//gambar lingkaran terakhir
GambarLingkaran(fjari);
end;
Langganan:
Postingan (Atom)