Materi grafika komputer

73
Grafika Komputer - Sept 2004 1 Wayan Firdaus Mahmudy Program Diploma III Manajemen Informatika & Teknik Komputer Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Brawijaya Malang

Transcript of Materi grafika komputer

Page 1: Materi grafika komputer

Grafika Komputer - Sept 2004 1

����������� �

�� ���������������������

������� ������

Wayan Firdaus Mahmudy

Program Diploma III

Manajemen Informatika & Teknik Komputer Fakultas Matematika dan Ilmu Pengetahuan Alam

Universitas Brawijaya Malang

Page 2: Materi grafika komputer

Grafika Komputer - Sept 2004 2

�����������

Bab 1. Fungsi Primitif dan Dasar-Dasar Operasi Grafik pada Delphi 1

Bab 2. Kurva 9

Bab 3. Interpolasi 19

Bab 4. Fractal Garis 26

Bab 5. Fractal Bidang Kompleks 33

Bab 6. Obyek 2D 43

Bab 7. Obyek 3D 52

Bab 8. Dasar-Dasar Pengolahan Citra Digital 60

Page 3: Materi grafika komputer

Grafika Komputer - Sept 2004 1

Bab

1

Fungsi Primitif dan Dasar-Dasar Operasi Grafik pada Delphi

Tujuan

• Mengambar bentuk-bentuk garis, persegi dan elips menggunakan fungsi standar Delphi pada komponen PaintBox.

• Membuat fungsi primitif untuk menggambar garis dan elips. Latihan 1.1 Pada latihan ini dikenalkan fungsi-fungsi standar Delphi untuk penggambaran garis, persegi dan lingkaran.

Rancangan tampilan dibuat sebagai berikut:

Isi event sebagai berikut:

Unit1.PAS 01 02 03 04 05 06 07

… type TForm1 = class(TForm) PaintBox1: TPaintBox; ButtonGaris: TButton; ButtonHapus: TButton; ButtonLingkaran: TButton;

PaintBox1

Page 4: Materi grafika komputer

Grafika Komputer - Sept 2004 2

08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

ButtonKotak: TButton; ButtonKeluar: TButton; procedure ButtonKeluarClick(Sender: TObject); procedure ButtonHapusClick(Sender: TObject); procedure ButtonGarisClick(Sender: TObject); procedure ButtonKotakClick(Sender: TObject); procedure ButtonLingkaranClick(Sender:TObject); end; … procedure TForm1.ButtonKeluarClick(Sender:TObject); begin Close; end; procedure TForm1.ButtonHapusClick(Sender: TObject); begin PaintBox1.Refresh; end; procedure TForm1.ButtonGarisClick(Sender: TObject); var i:integer; begin PaintBox1.Canvas.Pen.Color := clRed; for i:=1 to 40 do begin PaintBox1.Canvas.MoveTo (0,0); PaintBox1.Canvas.LineTo (PaintBox1.Width,10*i); end; end; procedure TForm1.ButtonKotakClick(Sender: TObject); var i:integer; x1,x2,y1,y2:integer; begin PaintBox1.Canvas.Pen.Color := clRed; x1 := 0; x2 := PaintBox1.Width-1; y1 := 0; y2 := PaintBox1.Height-1; for i:=1 to 8 do begin PaintBox1.Canvas.Rectangle (x1,y1,x2,y2); Inc (x1,15); Inc (y1,10); Dec (x2,15); Dec (y2,10); end;

Page 5: Materi grafika komputer

Grafika Komputer - Sept 2004 3

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

end; procedure TForm1.ButtonLingkaranClick(Sender: TObject); var i:integer; x1,x2,y1,y2:integer; begin PaintBox1.Canvas.Pen.Color := clBlue; x1 := 0; x2 := PaintBox1.Width-1; y1 := 0; y2 := PaintBox1.Height-1; for i:=1 to 8 do begin PaintBox1.Canvas.Ellipse (x1,y1,x2,y2); Inc (x1,15); Inc (y1,10); Dec (x2,15); Dec (y2,10); end; end;

Jika program dijalankan dan ButtonGaris diklik akan dihasilkan tampilan sebagai berikut:

Tampilan pada PaintBox untuk button lainnya adalah sebagai berikut:

Page 6: Materi grafika komputer

Grafika Komputer - Sept 2004 4

Setelah program di atas dijalankan cobalah untuk mengganti event untuk ButtonLingkaran dengan mengubah cara penggambaran lingkaran dimulai dari lingkaran terkecil ke lingkaran terbesar.

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16

procedure TForm1.ButtonLingkaranClick(Sender: TObject); var i:integer; x1,x2,y1,y2:integer; begin PaintBox1.Canvas.Pen.Color := clBlue; PaintBox1.Canvas.Brush.Style := bsClear; x1 := PaintBox1.Width div 2 - 5 ; x2 := x1 + 5; y1 := PaintBox1.Height div 2 - 5; y2 := y1 + 5; for i:=1 to 8 do begin PaintBox1.Canvas.Ellipse (x1,y1,x2,y2); Dec (x1,15); Dec (y1,10); Inc (x2,15); Inc (y2,10); end;

Page 7: Materi grafika komputer

Grafika Komputer - Sept 2004 5

17 end;

Jika pada bagian modifikasi baris 6 yang berisi

PaintBox1.Canvas.Brush.Style := bsClear;

dihapus, apa yang terjadi pada tampilan program, mengapa ?

Tugas Modifikasi tampilan program di atas sehinga tampilan untuk kotak dan lingkaran menjadi sebagai berikut:

Latihan 1.2 Pada latihan ini dibuat fungsi primitif untuk menggambar garis dan elips.

Desain tampilan hampir sama dengan Latihan 1.1. Jika program dijalankan dan ButtonGaris diklik akan dihasilkan tampilan sebagai berikut:

Page 8: Materi grafika komputer

Grafika Komputer - Sept 2004 6

Jika ButtonEllipse diklik akan dihasilkan tampilan sebagai berikut:

Isi event sebagai berikut:

Unit1.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

… type TForm1 = class(TForm) PaintBox1: TPaintBox; ButtonGaris: TButton; ButtonHapus: TButton; ButtonEllipse: TButton; ButtonKeluar: TButton; procedure ButtonKeluarClick(Sender: TObject); procedure ButtonHapusClick(Sender: TObject); procedure ButtonGarisClick(Sender: TObject); procedure ButtonEllipseClick(Sender: TObject); end; var Form1: TForm1; implementation {$R *.DFM} procedure Line (Canvas:TCanvas; x1,y1,x2,y2:integer; Clr:TColor); var dx,dy,steps,k : integer;

Page 9: Materi grafika komputer

Grafika Komputer - Sept 2004 7

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

xinc,yinc,x,y : real; begin dx := x2-x1; dy := y2-y1; if Abs(dx)>Abs(dy) then steps := abs(dx) else steps := abs(dy); xinc := dx/steps; yinc := dy/steps; x := x1; y := y1; Canvas.Pixels[Round(x),Round(y)] := Clr; for k:=1 to steps do begin x := x + xinc; y := y + yinc; Canvas.Pixels[Round(x),Round(y)] := Clr; end; end; procedure Ellipse (Canvas:TCanvas; x1,y1,x2,y2:integer; Clr:TColor); var x,y,xc,yc,a,b,aa,bb,xx:real; begin xc := (x2-x1) / 2 + x1 - 1; yc := (y2-y1) / 2 + y1 - 1; a := Abs(x2-x1)/2; b := Abs(y2-y1)/2; aa := Sqr (a); bb := Sqr (b); x := 0; while x<=a do begin xx := Sqr(x); y := Sqrt (bb*(1-xx/aa)); Canvas.Pixels[Round(xc+x),Round(yc+y)] := Clr; Canvas.Pixels[Round(xc+x),Round(yc-y)] := Clr; Canvas.Pixels[Round(xc-x),Round(yc+y)] := Clr; Canvas.Pixels[Round(xc-x),Round(yc-y)] := Clr; x := x + 1; end;

Page 10: Materi grafika komputer

Grafika Komputer - Sept 2004 8

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

end; procedure TForm1.ButtonKeluarClick(Sender:TObject); begin Close; end; procedure TForm1.ButtonHapusClick(Sender: TObject); begin PaintBox1.Refresh; end; procedure TForm1.ButtonGarisClick(Sender: TObject); var w,h:integer; begin w := PaintBox1.Width; h := PaintBox1.Height; Line (PaintBox1.Canvas, 0,0, w, 0, clRed); Line (PaintBox1.Canvas, 0,0, w, h, clRed); Line (PaintBox1.Canvas, 0,0, 0, h, clRed); Line (PaintBox1.Canvas, w,h, w-160,h-50,clBlue); end; procedure TForm1.ButtonEllipseClick(Sender:TObject); var i:integer; x1,x2,y1,y2:integer; begin x1 := 1; x2 := PaintBox1.Width-2; y1 := 1; y2 := PaintBox1.Height-2; Ellipse (PaintBox1.Canvas, x1,y1,x2,y2, clRed); Ellipse (PaintBox1.Canvas, x1+60,y1+10, x2-60,y2-10, clGreen); end;

Tugas Modifikasi program di atas sehingga tampilan elips tidak terputus.

Page 11: Materi grafika komputer

Grafika Komputer - Sept 2004 9

Bab

2

Kurva

Tujuan Mengambar bentuk-bentuk kurva pada sistem koordinat kartesius dan polar.

Latihan 2.1 Susun project untuk menggambar kurva sinus dengan tampilan sebagai berikut:

Anda harus menambahkan komponen non visual ColorDialog yang digunakan untuk mengatur warna kurva yang dihasilkan.

Isi event sebagai berikut:

Unit1.PAS 01 02 03 04 05 06 07 08

type TForm1 = class(TForm) PaintBox1: TPaintBox; ColorDialog1: TColorDialog; ButtonHapus: TButton; ButtonKeluar: TButton; ButtonSin: TButton; ButtonWarna: TButton;

Page 12: Materi grafika komputer

Grafika Komputer - Sept 2004 10

09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

procedure FormCreate(Sender: TObject); procedure ButtonKeluarClick(Sender: TObject); procedure ButtonHapusClick(Sender: TObject); procedure ButtonSinClick(Sender: TObject); procedure ButtonWarnaClick(Sender: TObject); end; var Form1: TForm1; Clr: TColor; implementation {$R *.DFM} const DeltaX = 0.5; Periode = 4; // fungsi yang akan digambar function Func (x:real):real; begin x := x/180 * PI; Result := Sin (Periode*x); end; // x1,x2,y1,y2 menunjukkan nilai koordinat // pada bidang cartesius // x1 : nilai koordinat paling kiri pada PaintBox // x2 : nilai koordinat paling kanan pada PaintBox // y1 : nilai koordinat paling bawah pada PaintBox // y2 : nilai koordinat paling atas pada PaintBox procedure GambarKurva (var PB:TPaintBox; x1,y1,x2,y2:real; Clr:TColor); var xs,ys,x,y:real; W,H:integer; begin PB.Canvas.Pen.Color := Clr; W := PB.Width; H := PB.Height; PB.Canvas.Rectangle(0,0,W,H); x := x1; y := Func (x); xs := (x-x1)/(x2-x1) * W; ys := H - (y-y1)/(y2-y1)*H;

Page 13: Materi grafika komputer

Grafika Komputer - Sept 2004 11

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

PB.Canvas.MoveTo (Round(xs),Round(ys)); repeat x := x + DeltaX; y := Func (x); xs := (x-x1)/(x2-x1) * W; ys := H - (y-y1)/(y2-y1)*H; PB.Canvas.LineTo(Round(xs),Round(ys)); until x>=x2; end; procedure TForm1.FormCreate(Sender: TObject); begin Clr := clBlack; end; procedure TForm1.ButtonKeluarClick(Sender:TObject); begin Close; end; procedure TForm1.ButtonHapusClick(Sender: TObject); begin PaintBox1.Refresh; end; procedure TForm1.ButtonSinClick(Sender: TObject); begin GambarKurva (PaintBox1, 0,-2,360,2, Clr); end; procedure TForm1.ButtonWarnaClick(Sender: TObject); begin if ColorDialog1.Execute then Clr := ColorDialog1.Color; end;

Pengembangan

Modifikasi program di atas dengan membuat nilai DeltaX, Periode, x1, x2, y1, y2 bisa diinputkan saat program berjalan dengan menggunakan komponen Edit.

Page 14: Materi grafika komputer

Grafika Komputer - Sept 2004 12

Latihan 2.2 Project ini hampir sama dengan Latihan 2.1 dengan tambahan beberapa kurva lain.

Perhatikan fungsi kurva yang akan digambar dimasukkan sebagai parameter pada procedure GambarKurva.

Unit1.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19

type TForm1 = class(TForm) PaintBox1: TPaintBox; ButtonHapus: TButton; ButtonKeluar: TButton; ButtonSin: TButton; ButtonSinCos: TButton; ButtonPoli: TButton; procedure ButtonKeluarClick(Sender: TObject); procedure ButtonHapusClick(Sender: TObject); procedure ButtonSinClick(Sender: TObject); procedure ButtonSinCosClick(Sender: TObject); procedure ButtonPoliClick(Sender: TObject); end; var Form1: TForm1; implementation

Page 15: Materi grafika komputer

Grafika Komputer - Sept 2004 13

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

{$R *.DFM} const DeltaX = 0.5; Periode = 3; type TFuncX = function (x:real) : real; {$F+} function SinX (x:real):real; begin x := x/180 * PI; SinX := Sin(Periode*x); end; function SinCosX (x:real):real; begin x := x/180*PI; SinCosX := Sin(2*x) + Cos(x); end; function Poli (x:real):real; begin Poli := 0.5*x*x*x - 2*x*x + x ; end; {$F-} procedure GambarKurva (FuncX:TFuncX; x1,y1,x2,y2:real; var PaintBox1:TPaintBox); var xs,ys,x,y:real; W,H:integer; begin W := PaintBox1.Width; H := PaintBox1.Height; PaintBox1.Canvas.Rectangle(0,0,W,H); x := x1; y := FuncX(x); xs := (x-x1)/(x2-x1) * W; ys := H - (y-y1)/(y2-y1)*H; PaintBox1.Canvas.MoveTo(Round(xs),Round(ys)); repeat x := x + DeltaX; y := FuncX(x);

Page 16: Materi grafika komputer

Grafika Komputer - Sept 2004 14

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

xs := (x-x1)/(x2-x1) * W; ys := H - (y-y1)/(y2-y1)*H; PaintBox1.Canvas.LineTo(Round(xs),Round(ys)); until x>=x2; end; procedure TForm1.ButtonKeluarClick(Sender:TObject); begin Close; end; procedure TForm1.ButtonHapusClick(Sender: TObject); begin PaintBox1.Refresh; end; procedure TForm1.ButtonSinClick(Sender: TObject); begin GambarKurva (SinX, 0,-2,360,2, PaintBox1); end; procedure TForm1.ButtonSinCosClick(Sender:TObject); begin GambarKurva (SinCosX, 0,-2,360,2, PaintBox1); end; procedure TForm1.ButtonPoliClick(Sender: TObject); begin GambarKurva (Poli, -5,-150,10,150, PaintBox1); end;

Pengembangan

Seperti pada latihan sebelumnya modifikasi program di atas dengan membuat nilai DeltaX, Periode, x1, x2, y1, y2 bisa diinputkan saat program berjalan dengan menggunakan komponen Edit. Tambahkan juga pengatur warna kurva seperti pada latihan sebelumnya.

Page 17: Materi grafika komputer

Grafika Komputer - Sept 2004 15

Latihan 2.3 Susun project untuk menggambar kurva dalam koordinat polar dengan tampilan sebagai berikut:

Isi event sebagai berikut:

Unit1.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19

type TForm1 = class(TForm) PaintBox1: TPaintBox; ButtonHapus: TButton; ButtonKeluar: TButton; ButtonLingkaran: TButton; ButtonSinus: TButton; ButtonSinCos: TButton; procedure ButtonKeluarClick(Sender: TObject); procedure ButtonHapusClick(Sender: TObject); procedure ButtonLingkaranClick(Sender: TObject); procedure ButtonSinusClick(Sender: TObject); procedure ButtonSinCosClick(Sender: TObject); end; var Form1: TForm1; implementation

Page 18: Materi grafika komputer

Grafika Komputer - Sept 2004 16

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

{$R *.DFM} type TFuncT = function (t:real) : real; {$F+} function Lingkaran (t:real) : real; begin Lingkaran := 5 end; function Sinus (t:real) : real; begin t := t/180 * PI; Sinus := Abs(5*Sin(t)); end; function SinCos (t:real):real; begin t := t/180 * PI; SinCos:= Abs(10*Sin(4*Cos(4*t))); end; {$F-} procedure KonversiKoordinat (t,r:real; var x,y:real); begin x := r * Cos (t/180*PI); y := r * Sin (t/180*PI); end; procedure GambarKurva (FuncT:TFuncT; t1,t2,dt, x1,y1,x2,y2:real; var PaintBox1:TPaintBox); var xs,ys,t,x,y:real; W,H:integer; begin W := PaintBox1.Width; H := PaintBox1.Height; PaintBox1.Canvas.Rectangle(0,0,W,H); t := t1; KonversiKoordinat (t, FuncT(t), x,y); xs := (x-x1)/(x2-x1) * W; ys := H - (y-y1)/(y2-y1)*H; PaintBox1.Canvas.MoveTo(Round(xs),Round(ys));

Page 19: Materi grafika komputer

Grafika Komputer - Sept 2004 17

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

repeat t := t + dt; KonversiKoordinat (t, FuncT(t), x,y); xs := (x-x1)/(x2-x1) * W; ys := H - (y-y1)/(y2-y1)*H; PaintBox1.Canvas.LineTo(Round(xs),Round(ys)); until t>=t2; end; procedure TForm1.ButtonKeluarClick(Sender:TObject); begin Close; end; procedure TForm1.ButtonHapusClick(Sender: TObject); begin PaintBox1.Refresh; end; procedure TForm1.ButtonLingkaranClick(Sender: TObject); begin GambarKurva (Lingkaran, 0,360,1, -10,-10,10,10, PaintBox1); end; procedure TForm1.ButtonSinusClick(Sender: TObject); begin GambarKurva (Sinus, 0,360,1, -10,-10,10,10, PaintBox1); end; procedure TForm1.ButtonSinCosClick(Sender:TObject); begin GambarKurva (SinCos, 0,360,1, -10,-10,10,10, PaintBox1); end;

Page 20: Materi grafika komputer

Grafika Komputer - Sept 2004 18

Pengembangan

Cobalah untuk mengganti fungsi Lingkaran sebagai berikut:

01 02 03 04 05 06 07 08

function Lingkaran (t:real) : real; begin case Round(t) of 0..90, 180..270, 360 : Lingkaran := 5 else Lingkaran := 8; end; end;

Jika ButtonLingkaran diklik maka dihasilkan tampilan sebagai berikut:

Lakukan modifikasi fungsi Lingkaran untuk menghasilkan tampilan sebagai berikut:

Page 21: Materi grafika komputer

Grafika Komputer - Sept 2004 19

Bab

3

Interpolasi

Tujuan Menggambar kurva hasil interpolasi beberapa titik.

Latihan 3 Pada project ini digunakan metode Interpolasi Newton Umum Beda Terbagi untuk menghubungkan titik-titik yang ditulis pada StringGrid. Metode interpolasi Newton ditulis pada unit INBT dan tidak dibahas secara matematis.

Sebagai panduan untuk menentukan posisi titik pada PaintBox digunakan event OnMouseMove untuk menampilkan pada sebuah label posisi x dan y dari kursor pada PaintBox.

Isi event sebagai berikut:

Unit1.PAS 01 02 03

type TForm1 = class(TForm) PaintBox1: TPaintBox;

Page 22: Materi grafika komputer

Grafika Komputer - Sept 2004 20

04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

ButtonHapus: TButton; ButtonKeluar: TButton; ButtonPlot: TButton; ButtonKurva: TButton; StringGrid1: TStringGrid; LabelPos: TLabel; procedure FormCreate(Sender: TObject); procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure ButtonKeluarClick(Sender: TObject); procedure ButtonHapusClick(Sender: TObject); procedure ButtonPlotClick(Sender: TObject); procedure ButtonKurvaClick(Sender: TObject); end; var Form1: TForm1; implementation {$R *.DFM} uses INBT; var Newton: TIntNewton; procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.Cells [0,0] := ' X '; StringGrid1.Cells [1,0] := ' Y '; Newton := TIntNewton.Create; end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); begin LabelPos.Caption := 'X='+IntToStr(x)+ ' Y='+IntToStr(y); end; procedure TForm1.ButtonKeluarClick(Sender:TObject); begin Close;

Page 23: Materi grafika komputer

Grafika Komputer - Sept 2004 21

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

end; procedure TForm1.ButtonHapusClick(Sender: TObject); begin PaintBox1.Refresh; PaintBox1.Canvas.Rectangle (0,0, PaintBox1.Width, PaintBox1.Height); end; procedure TForm1.ButtonPlotClick(Sender: TObject); var i,x,y:integer; begin { gambar titik asal } PaintBox1.Canvas.Pen.Color := clBlue; for i:=1 to StringGrid1.RowCount do if (StringGrid1.Cells[0,i]<>'') and (StringGrid1.Cells[1,i]<>'') then begin x := StrToInt (StringGrid1.Cells[0,i]); y := StrToInt (StringGrid1.Cells[1,i]); PaintBox1.Canvas.Ellipse (x-2,y-2,x+2,y+2); end; end; procedure TForm1.ButtonKurvaClick(Sender: TObject); var x,y:real; i:TIndex; begin Newton.Clear; for i:=1 to StringGrid1.RowCount do if (StringGrid1.Cells[0,i]<>'') and (StringGrid1.Cells[1,i]<>'') then begin x := StrToFloat (StringGrid1.Cells[0,i]); y := StrToFloat (StringGrid1.Cells[1,i]); Newton.Add (x,y); end; x := Newton.GetX (1); y := Newton.GetY (1); PaintBox1.Canvas.Pen.Color := clRed; PaintBox1.Canvas.MoveTo (Round(x), Round(y)); while x<Newton.Xmax do begin PaintBox1.Canvas.LineTo (Round(x), Round(y));

Page 24: Materi grafika komputer

Grafika Komputer - Sept 2004 22

92 93 94 95

x := x + 1; y := Newton.Yint(x); end; end;

INBT.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

unit INBT; { Interpolasi Newton Umum Beda Terbagi } interface const MAXDATA = 20; type TIndex = 0..MAXDATA; TFloat = real; TArray1 = array [1..MAXDATA] of TFloat; TArray2 = array [1..MAXDATA, 0..MAXDATA] of TFloat; TIntNewton = class private DataX : TArray1; DataY : TArray2; nData : TIndex; public constructor Create; destructor Destroy; procedure Clear; procedure Add (x,y:TFloat); function GetNumData : TIndex; function Xmin : TFloat; function Xmax : TFloat; function GetX (i:integer) : TFloat; function GetY (i:integer) : TFloat; function Yint (Xi:TFloat) : TFloat; end; implementation

Page 25: Materi grafika komputer

Grafika Komputer - Sept 2004 23

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

constructor TIntNewton.Create; begin Clear; end; destructor TIntNewton.Destroy; begin end; procedure TIntNewton.Clear; begin nData := 0; end; procedure TIntNewton.Add (x,y:TFloat); begin Inc (nData); DataX[nData] := x; DataY[nData,0] := y; end; function TIntNewton.GetNumData : TIndex; begin GetNumData := nData; end; function TIntNewton.Xmin : TFloat; begin Xmin := DataX[1]; end; function TIntNewton.Xmax : TFloat; begin Xmax := DataX[nData]; end; function TIntNewton.GetX (i:integer) : TFloat; begin GetX := DataX[i]; end; function TIntNewton.GetY (i:integer) : TFloat; begin

Page 26: Materi grafika komputer

Grafika Komputer - Sept 2004 24

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

GetY := DataY[i,0]; end; // mencari perkiraan nilai Y pada posisi X function TIntNewton.Yint (Xi:TFloat) : TFloat; var i,j:TIndex; Yi, TotX : TFloat; N : TIndex; X : TArray1; Y : TArray2; begin N := nData; X := DataX; Y := DataY; if (Xi<=X[1]) or (Xi>=X[N]) then begin Yint := 0; Exit; end; i:=1; while X[i]<Xi do Inc(i); j := i-1; N := N - j + 1; for i:=1 to N do begin X[i] := X[i+j-1]; Y[i,0] := Y[i+j-1, 0] end; { hitung beda } for j:=1 to N-1 do for i:=1 to N-j do Y[i,j] := (Y[i+1,j-1] - Y[i,j-1]) / (X[i+j]-X[i]); TotX := (Xi-X[1]); Yi := Y[1,0]; for i:=1 to N-1 do begin Yi := Yi + TotX * Y[1,i]; TotX := TotX * (Xi-X[i+1]);

Page 27: Materi grafika komputer

Grafika Komputer - Sept 2004 25

126 127 128 129 130

end; Yint := Yi; end; end.

Pengembangan

Modifikasi program di atas sebagai berikut:

- Tambahkan satu buton untuk menghapus isi StringGrid.

- Tambahkan fasilitas sehingga user bisa menambahkan titik pada StringGrid dengan mengklik pada PaintBox dan sekaligus menampilkan plot titik.

Page 28: Materi grafika komputer

Grafika Komputer - Sept 2004 26

Bab

4

Fractal Garis

Tujuan Menggambar berbagai macam fractal garis.

Latihan 4 Susun project untuk menggambar fractal garis dengan contoh tampilan sebagai berikut (Quadric Koch orde 5):

Contoh fractal lain (kurva C orde 10) yang dihasilkan adalah:

Page 29: Materi grafika komputer

Grafika Komputer - Sept 2004 27

Perhatikan dalam unit berikut event untuk empat buton penggambar fractal mengarah ke satu procedur.

Unit1.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

type TForm1 = class(TForm) PaintBox1: TPaintBox; ButtonClear: TButton; BitBtnClose: TBitBtn; ButtonTriKoch: TButton; ButtonQuaKoch: TButton; ButtonKurvaC: TButton; ButtonLayangLayang: TButton; SpinEditOrde: TSpinEdit; SpinEditArah: TSpinEdit; SpinEditPanjang: TSpinEdit; SpinEditX: TSpinEdit; SpinEditY: TSpinEdit; LabelFractal: TLabel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; procedure FormCreate(Sender: TObject); procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure ButtonClearClick(Sender: TObject); procedure ButtonDrawFractalClick(Sender:TObject); end; var Form1: TForm1; implementation {$R *.DFM} uses Fractal; procedure TForm1.FormCreate(Sender: TObject); begin PtrPaintBox := @PaintBox1; end;

Page 30: Materi grafika komputer

Grafika Komputer - Sept 2004 28

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

procedure TForm1.PaintBox1MouseMove(Sender:TObject; Shift: TShiftState; X,Y: Integer); begin Caption := 'Fractal Generator - X, Y : ' + IntToStr(X) + ',' + IntToStr(Y); end; procedure TForm1.ButtonClearClick(Sender: TObject); begin PaintBox1.Refresh; end; procedure TForm1.ButtonDrawFractalClick(Sender:TObject); var x,y,Orde,Arah,Panjang:integer; begin x := SpinEditX.Value; y := SpinEditY.Value; PaintBox1.Canvas.MoveTo (x,y); Orde := SpinEditOrde.Value; Arah := SpinEditArah.Value; Panjang := SpinEditPanjang.Value; if Sender=ButtonTriKoch then begin LabelFractal.Caption := 'Triadic Koch'; TriadicKoch (Orde, Arah, Panjang); end else if Sender=ButtonQuaKoch then begin LabelFractal.Caption := 'Quadric Koch'; QuadricKoch (Orde, Arah, Panjang); end else if Sender=ButtonKurvaC then begin LabelFractal.Caption := 'Kurva C'; KurvaC (Orde, Arah, Panjang); end else if Sender=ButtonLayangLayang then begin LabelFractal.Caption := 'Layang-Layang'; LayangLayang (Orde, Arah, Panjang); end; end;

Page 31: Materi grafika komputer

Grafika Komputer - Sept 2004 29

Unit berikut berisi prosedur penggambar beberapa fractal. Fractal Quadric Koch dan Kurva C tidak ditulis dan anda harus melengkapi sendiri.

Fractal.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

unit Fractal; interface uses WinTypes, ExtCtrls; var PtrPaintBox : ^TPaintBox; procedure TriadicKoch (Orde:byte; Arah,Panjang:real); procedure QuadricKoch (Orde:byte; Arah,Panjang:real); procedure KurvaC (Orde:byte; Arah,Panjang:real); procedure LayangLayang (Orde:byte; Arah,Panjang:real); implementation procedure LineRel (dx,dy:integer); var Point:TPoint; begin Point := PtrPaintBox^.Canvas.PenPos; PtrPaintBox^.Canvas.LineTo (Point.X+dx, Point.Y+dy); end; procedure TriadicKoch (Orde:byte; Arah,Panjang:real); var dX,dY:integer; begin if Orde>0 then begin TriadicKoch (Orde-1,Arah,Panjang/3); Arah := Arah+60; TriadicKoch (Orde-1,Arah,Panjang/3); Arah := Arah-120; TriadicKoch (Orde-1,Arah,Panjang/3); Arah := Arah+60; TriadicKoch (Orde-1,Arah,Panjang/3); end else begin dX := Round(Panjang*Cos(Arah/180*PI));

Page 32: Materi grafika komputer

Grafika Komputer - Sept 2004 30

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

dY := Round(Panjang*Sin(Arah/180*PI)); LineRel (dX,dY); end; end; procedure QuadricKoch (Orde:byte; Arah,Panjang:real); begin … end; procedure KurvaC (Orde:byte; Arah,Panjang:real); begin … end; procedure LayangLayang (Orde:byte; Arah,Panjang:real); var dX,dY:integer; begin if Orde>0 then begin LayangLayang (Orde-1,Arah,Panjang/2); Arah := Arah+45; LayangLayang (Orde-1,Arah,Panjang/2); Arah := Arah-90; LayangLayang (Orde-1,Arah,Panjang/2); Arah := Arah-90; LayangLayang (Orde-1,Arah,Panjang/2); Arah := Arah-90; LayangLayang (Orde-1,Arah,Panjang/2); Arah := Arah+45; LayangLayang (Orde-1,Arah,Panjang/2); end else begin dX := Round(Panjang*Cos(Arah/180*PI)); dY := Round(Panjang*Sin(Arah/180*PI)); LineRel (dX,dY); end; end; end.

Page 33: Materi grafika komputer

Grafika Komputer - Sept 2004 31

Berikut ini contoh gambar fractal Triadic dan Quadric Koch untuk tiap orde:

Orde Triadic Koch Quadric Koch

0

1

2

3

4

5

Page 34: Materi grafika komputer

Grafika Komputer - Sept 2004 32

Berikut ini contoh gambar fractal C dan Layang-Layang untuk tiap orde:

Orde Kurva C Layang-Layang

0

1

2

3

4

5

Pengembangan

Cobalah definisikan fractal buatan anda sendiri dan tambahkan ke program.

Page 35: Materi grafika komputer

Grafika Komputer - Sept 2004 33

Bab

5

Fractal Bidang Kompleks

Tujuan Menggambar berbagai macam fractal dalam bidang kompleks.

Latihan 5 Susun project untuk menggambar fractal bidang kompleks dengan struktur menu sebagai berikut:

File Open : menampilkan isi file bmp Save : menyimpan gambar fractal ke file bmp

Draw Mandelbrot : menggambar fractal Mandelbrot Julia : menggambar fractal Julia

Untuk bisa menampilkan dan menyimpan gambar digunakan komponen Image untuk menggantikan PaintBox.

Contoh tampilan jika dipilih Draw – Mandelbrot.

Page 36: Materi grafika komputer

Grafika Komputer - Sept 2004 34

Contoh tampilan jika dipilih Draw – Julia.

Isi event sebagai berikut:

Unit1.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

type TForm1 = class(TForm) MainMenu1: TMainMenu; MenuFile: TMenuItem; MenuFileOpen: TMenuItem; MenuFileSave: TMenuItem; MenuDraw: TMenuItem; MenuDrawMandelbrot: TMenuItem; MenuDrawJulia: TMenuItem; Image1: TImage; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; procedure FormCreate(Sender: TObject); procedure MenuFileOpenClick(Sender: TObject); procedure MenuFileSaveClick(Sender: TObject); procedure MenuDrawMandelbrotClick(Sender: TObject); procedure MenuDrawJuliaClick(Sender: TObject); end; var Form1 : TForm1; implementation {$R *.DFM}

Page 37: Materi grafika komputer

Grafika Komputer - Sept 2004 35

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

uses Palets, FrtCmp, Complex; var Parameter: TParCmpFrt; Palet: TPalet; procedure TForm1.FormCreate(Sender: TObject); begin Palet := TPalet.Create (64); Parameter.C := TComplex.Create (0,0); end; procedure TForm1.MenuFileOpenClick(Sender:TObject); begin if OpenDialog1.Execute then Image1.Picture.LoadFromFile (OpenDialog1.FileName); end; procedure TForm1.MenuFileSaveClick(Sender:TObject); var FileName:string; begin if SaveDialog1.Execute then begin FileName := SaveDialog1.FileName; if ExtractFileExt(FileName)='' then FileName:=FileName+'.bmp'; Image1.Picture.SaveToFile (FileName); end; end; procedure TForm1.MenuDrawMandelbrotClick(Sender:TObject); begin with Parameter do begin xMin := -2; xMax := 1; yMin := -1.5; yMax := 1.5; MaxIteration := 64; MaxMagnitude := 4.0; end; MandelbrotDraw (Parameter, Palet, Image1);

Page 38: Materi grafika komputer

Grafika Komputer - Sept 2004 36

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

end; procedure TForm1.MenuDrawJuliaClick(Sender: TObject); begin with Parameter do begin xMin := -0.2; xMax := 0.2; yMin := 0.5; yMax := 0.9; MaxIteration := 64; MaxMagnitude := 1000; C.Init (0.6, 0.8); end; JuliaDraw (Parameter, Palet, Image1); end;

Unit berikut berisi prosedur penggambar fractal bidang kompleks.

FrctCmp.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

unit FrtCmp; interface uses Complex, Palets, ExtCtrls; procedure MandelbrotDraw (Par:TParCmpFrT; var Palet:TPalet; var Image:TImage); procedure JuliaDraw (Par:TParCmpFrT; var Palet:TPalet; var Image:TImage); implementation procedure MandelbrotDraw (Par:TParCmpFrT; var Palet:TPalet; var Image:TImage); var x,y:integer; dX,dY:real; Z:TComplex; Color:byte; Width,Height:integer; begin Width := Image.Width; Height := Image.Height;

Page 39: Materi grafika komputer

Grafika Komputer - Sept 2004 37

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

dX := (Par.XMax-Par.XMin) / Width; dY := (Par.YMax-Par.YMin) / Height; Z := TComplex.Create (0,0); for x:=0 to Width-1 do begin for y:=0 to Height-1 do with Par do begin Z.Init (0,0); C.Init (XMin+x*dX, YMax-y*dY); Color := 0; while (Color<MaxIteration) and (Z.Magnitude<MaxMagnitude) do begin Inc (Color); Z.Mul (Z,Z); Z.Add (Z,C); end; Image.Canvas.Pixels[x,y] := Palet[Color]; end; Image.Repaint; end; end; procedure JuliaDraw (Par:TParCmpFrT; var Palet:TPalet; var Image:TImage); var x,y:integer; dX,dY:real; Z:TComplex; Color:byte; Width,Height:integer; begin Width := Image.Width; Height := Image.Height; dX := (Par.XMax-Par.XMin) / Width; dY := (Par.YMax-Par.YMin) / Height; Z := TComplex.Create (0,0); for x:=0 to Width-1 do begin for y:=0 to Height-1 do with Par do begin Z.Init (XMin+x*dX, YMax-y*dY); Color := 0; while (Color<MaxIteration) and (Z.Magnitude<MaxMagnitude) do

Page 40: Materi grafika komputer

Grafika Komputer - Sept 2004 38

67 68 69 70 71 72 73 74 75 76 77 78 79

begin Inc (Color); Z.Mul (Z,Z); Z.Add (Z,C); end; Image.Canvas.Pixels[x,y] := Palet[Color]; end; Image.Repaint; end; end; begin end.

Unit berikut mengatur palet warna yang dipakai dalam menggambar fractal.

Palet.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

unit Palets; interface uses Graphics, Complex; type { parameters of complex fractal } TParCmpFrt = record xMin, xMax, yMin, yMax : real; MaxIteration : byte; MaxMagnitude : real; C : TComplex; end; TRecPalet = record Red, Green, Blue : byte; dR, dG, dB : integer; end; TPalet = class private DataPalet : array [0..255] of TColor;

Page 41: Materi grafika komputer

Grafika Komputer - Sept 2004 39

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Palet : TRecPalet; function GetColor (idx:byte) : TColor; public constructor Create (MaxColor:byte); procedure Init (MaxColor:byte; SP:TRecPalet); procedure InitDefault (MaxColor:byte); property Color [idx:byte]:TColor read GetColor; default; end; IMPLEMENTATION constructor TPalet.Create (MaxColor:byte); begin InitDefault (MaxColor); end; procedure TPalet.Init (MaxColor:byte; SP:TRecPalet); var i,R,G,B : byte; begin R:=SP.Red; G:=SP.Green; B:=SP.Blue; for i:=0 to MaxColor-1 do begin DataPalet[i] := R + 256*G + 256*256*B; R:=R+SP.dR; G:=G+SP.dG; B:=B+SP.dB; end; DataPalet[MaxColor] := 0; end; procedure TPalet.InitDefault (MaxColor:byte); var SP:TRecPalet; begin SP.Red:=0; SP.Green:=200; SP.Blue:=100; SP.dR:=30; SP.dG:=-30; SP.dB:=50; Init (MaxColor, SP); end; function TPalet.GetColor (idx:byte) : TColor; begin

Page 42: Materi grafika komputer

Grafika Komputer - Sept 2004 40

72 73 74 75 76

Result := DataPalet[idx]; end; begin end.

Unit berikut berisi implementasi operasi bilangan kompleks.

Complex.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

unit Complex; INTERFACE type TComplex = class private re,im : real; public constructor Create (r,i:real); destructor Destroy; procedure Init (r,i:real); function Magnitude : real; procedure Con; procedure Add (A,B:TComplex); procedure Sub (A,B:TComplex); procedure Mul (A,B:TComplex); procedure Divi (A,B:TComplex); end; IMPLEMENTATION constructor TComplex.Create (r,i:real); begin Init (r,i); end; destructor TComplex.Destroy; begin end; procedure TComplex.Init (r,i:real); begin

Page 43: Materi grafika komputer

Grafika Komputer - Sept 2004 41

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

re:=r; im:=i; end; function TComplex.Magnitude : real; begin Result := re*re + im*im; end; procedure TComplex.Con; begin im := -im; end; procedure TComplex.Add (A,B:TComplex); var _re,_im:real; begin _re := A.re + B.re; _im := A.im + B.im; Init (_re,_im); end; procedure TComplex.Sub (A,B:TComplex); var _re,_im:real; begin _re := A.re - B.re; _im := A.im - B.im; Init (_re,_im); end; procedure TComplex.Mul (A,B:TComplex); var _re,_im:real; begin _re := (A.re * B.re) - (A.im * B.im); _im := (A.re * B.im) + (A.im * B.re); Init (_re,_im); end; procedure TComplex.Divi (A,B:TComplex); var Bc, C : TComplex; sq : real; begin Bc := B; BC.Con; C.Mul (A,Bc);

Page 44: Materi grafika komputer

Grafika Komputer - Sept 2004 42

80 81 82 83 84 85 86

sq := Sqr(B.re) + Sqr(B.im); re := C.re / sq; im := C.im / sq; end; begin end.

Pengembangan

Lakukan modifikasi sebagai berikut:

- Tambahkan menu untuk mengatur parameter penggambaran fractal dalam record TParCmpFrt.

- Tambahkan menu untuk mengatur palet warna.

Page 45: Materi grafika komputer

Grafika Komputer - Sept 2004 43

Bab

6

Obyek 2D

Tujuan Melakukan transformasi obyek dua dimensi.

Latihan 6 Susun project untuk trasformasi obyek 2D dengan tampilan sebagai berikut:

ButtonLoad dan ButtonSave di atas digunakan untuk mengambil dan meyimpan data koordinat obyek 2D bukan gambarnya.

Page 46: Materi grafika komputer

Grafika Komputer - Sept 2004 44

Isi event sebagai berikut:

Unit1.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

type TForm1 = class(TForm) PaintBox1: TPaintBox; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; BitBtnLoad: TBitBtn; BitBtnSave: TBitBtn; BitBtnClear: TBitBtn; BitBtnClose: TBitBtn; GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; GroupBox4: TGroupBox; GroupBox5: TGroupBox; CheckBoxCenter: TCheckBox; EditScalingDX: TEdit; EditScalingDY: TEdit; EditAngle: TEdit; EditShearingdX: TEdit; EditShearingdY: TEdit; ButtonViewCenter: TButton; ButtonScaling: TButton; ButtonRotation: TButton; ButtonReflectionX: TButton; ButtonReflectionY: TButton; ButtonShearing: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; procedure FormCreate(Sender: TObject); procedure BitBtnLoadClick(Sender: TObject); procedure BitBtnSaveClick(Sender: TObject); procedure BitBtnClearClick(Sender: TObject);

Page 47: Materi grafika komputer

Grafika Komputer - Sept 2004 45

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

procedure ButtonViewCenterClick(Sender: TObject); procedure ButtonScalingClick(Sender: TObject); procedure ButtonRotationClick(Sender: TObject); procedure ButtonReflectionXClick(Sender: TObject); procedure ButtonReflectionYClick(Sender: TObject); procedure ButtonShearingClick(Sender: TObject); end; var Form1: TForm1; implementation {$R *.DFM} uses OB2D; var Object2D : TObject2D; procedure TForm1.FormCreate(Sender: TObject); begin Object2D := TObject2D.Create; end; procedure TForm1.BitBtnLoadClick(Sender: TObject); begin if OpenDialog1.Execute then begin Object2D.Load (OpenDialog1.FileName); Caption := 'Obyek 2 Dimensi - ' + ExtractFileName(OpenDialog1.FileName); end; Object2D.Draw(CheckBoxCenter.Checked,PaintBox1); end; procedure TForm1.BitBtnSaveClick(Sender: TObject); begin if SaveDialog1.Execute then Object2D.Save (SaveDialog1.FileName); end;

Page 48: Materi grafika komputer

Grafika Komputer - Sept 2004 46

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129

procedure TForm1.BitBtnClearClick(Sender: TObject); begin PaintBox1.Refresh; end; procedure TForm1.ButtonViewCenterClick(Sender:TObject); begin Object2D.Draw (true, PaintBox1); end; procedure TForm1.ButtonScalingClick(Sender:TObject); begin Object2D.Scaling ( StrToFloat(EditScalingDX.text), StrToFloat(EditScalingDY.text)); Object2D.Draw (CheckBoxCenter.Checked, PaintBox1); end; procedure TForm1.ButtonRotationClick(Sender: TObject); begin Object2D.Rotation (StrToFloat(EditAngle.text)); Object2D.Draw (CheckBoxCenter.Checked, PaintBox1); end; procedure TForm1.ButtonReflectionXClick(Sender:TObject); begin Object2D.Reflection (true,false); Object2D.Draw (CheckBoxCenter.Checked, PaintBox1); end; procedure TForm1.ButtonReflectionYClick(Sender:TObject); begin Object2D.Reflection (false,true); Object2D.Draw (CheckBoxCenter.Checked, PaintBox1); end; procedure TForm1.ButtonShearingClick(Sender: TObject); var fx,fy:real; begin fx := StrToFloat (EditShearingDX.text); fy := StrToFloat (EditShearingDY.text); Object2D.Shearing (fx, fy); Object2D.Draw (CheckBoxCenter.Checked, PaintBox1); end;

Page 49: Materi grafika komputer

Grafika Komputer - Sept 2004 47

Unit berikut berisi struktur data beserta operasinya dari obyek 2D.

OB2D.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

unit OB2D; interface uses ExtCtrls; const MAX_VERTEX = 30; type TVertex = record x,y : real; end; TIndex = 0..MAX_VERTEX; TObject2D = class private nVertexs : byte; Vertexs : array [1..MAX_VERTEX] of TVertex; public constructor Create; destructor Destroy; procedure Draw (Centered:boolean; var PB:TPaintBox); procedure Load (FileName:string); procedure Save (FileName:string); procedure Translation (dx,dy:real); procedure Scaling (dx,dy:real); procedure Rotation (t:real); procedure Shearing (dx,dy:real); procedure Reflection (rx,ry:boolean); procedure Center (x1,y1,x2,y2:real); end; implementation constructor TObject2D.Create; begin nVertexs := 0;

Page 50: Materi grafika komputer

Grafika Komputer - Sept 2004 48

42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

end; destructor TObject2D.Destroy; begin end; procedure TObject2D.Draw (Centered:boolean; var PB:TPaintBox); var i:TIndex; begin PB.Refresh; if Centered then Center (0,0,PB.Width-1,PB.Height-1); i := nVertexs; with Vertexs[i] do PB.Canvas.MoveTo (Round(x), Round(y)); for i:=1 to nVertexs do with Vertexs[i] do PB.Canvas.LineTo (Round(x), Round(y)); end; procedure TObject2D.Load (FileName:string); var i:TIndex; F:TextFile; begin AssignFile (F,FileName); Reset(F); ReadLn (F, nVertexs); for i:=1 to nVertexs do ReadLn(F, Vertexs[i].x, Vertexs[i].y); CloseFile (F); end; procedure TObject2D.Save (FileName:string); var i:TIndex; F:TextFile; begin AssignFile (F,FileName); ReWrite (F); WriteLn(F, nVertexs); for i:=1 to nVertexs do WriteLn(F, Vertexs[i].x,' ',Vertexs[i].y); CloseFile (F); end; procedure TObject2D.Translation (dx,dy:real);

Page 51: Materi grafika komputer

Grafika Komputer - Sept 2004 49

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129

var i:TIndex; begin for i:=1 to nVertexs do begin Vertexs[i].x := Vertexs[i].x + dx; Vertexs[i].y := Vertexs[i].y + dy; end; end; procedure TObject2D.Scaling (dx,dy:real); var i:TIndex; begin for i:=1 to nVertexs do begin Vertexs[i].x := Vertexs[i].x * dx; Vertexs[i].y := Vertexs[i].y * dy; end; end; procedure TObject2D.Rotation (t:real); var i:TIndex; x,y:real; begin t := t/180*PI; for i:=1 to nVertexs do begin x := Vertexs[i].x; y := Vertexs[i].y; Vertexs[i].x := x * Cos(t) - y * Sin(t); Vertexs[i].y := x * Sin(t) + y * Cos(t); end; end; procedure TObject2D.Shearing (dx,dy:real); var i:TIndex; begin for i:=1 to nVertexs do Vertexs[i].x := Vertexs[i].x + Vertexs[i].y * dx; for i:=1 to nVertexs do Vertexs[i].y := Vertexs[i].y + Vertexs[i].x * dy; end; procedure TObject2D.Reflection (rx,ry:boolean);

Page 52: Materi grafika komputer

Grafika Komputer - Sept 2004 50

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

var i:TIndex; begin if rx then for i:=1 to nVertexs do Vertexs[i].y := -Vertexs[i].y; if ry then for i:=1 to nVertexs do Vertexs[i].x := -Vertexs[i].x; end; procedure TObject2D.Center (x1,y1,x2,y2:real); var i:TIndex; MinX,MinY,MaxX,MaxY,dx,dy:real; begin MinX := Vertexs[1].x; MinY := Vertexs[1].y; MaxX := Vertexs[1].x; MaxY := Vertexs[1].y; for i:=2 to nVertexs do begin if Vertexs[i].x<MinX then MinX:=Vertexs[i].x; if Vertexs[i].y<MinY then MinY:=Vertexs[i].y; if Vertexs[i].x>MaxX then MaxX:=Vertexs[i].x; if Vertexs[i].y>MaxY then MaxY:=Vertexs[i].y; end; dx := ((x2-x1) - (MaxX-MinX)) / 2 - MinX; dy := ((y2-y1) - (MaxY-MinY)) / 2 - MinY; Translation (dx,dy); end; begin end.

Berikut ini contoh struktur obyek 2D yang disimpan dalam file dengan ekstensi 2D. Baris pertama menunjukkan banyaknya titik/vertek dan baris berikutnya menunjukan pasangan nilai x dan y.

5 25 10 10 30 10 60 40 60 40 30

Page 53: Materi grafika komputer

Grafika Komputer - Sept 2004 51

Pengembangan

- Tambahkan fasilitas untuk mengatur warna dan ketebalan garis untuk mengambar obyek,

- Tambahkan fasilitas untuk menyimpan obyek dalam bentuk file bmp.

Page 54: Materi grafika komputer

Grafika Komputer - Sept 2004 52

Bab

7

Obyek 3D

Tujuan Melakukan transformasi obyek tiga dimensi.

Latihan 7 Susun project untuk trasformasi obyek 3D dengan tampilan sebagai berikut:

Isi event sebagai berikut:

Unit1.PAS 01 02 03 04 05 06 07

type TForm1 = class(TForm) Image1: TImage; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; GroupBox1: TGroupBox; GroupBox2: TGroupBox;

Page 55: Materi grafika komputer

Grafika Komputer - Sept 2004 53

08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

BitBtnClose: TBitBtn; BitBtnLoad: TBitBtn; BitBtnSave: TBitBtn; BitBtnClear: TBitBtn; ButtonRotateX: TButton; ButtonRotateY: TButton; ButtonRotateZ: TButton; ButtonResize: TButton; EditAngle: TEdit; EditResize: TEdit; Label3: TLabel; procedure FormCreate(Sender: TObject); procedure BitBtnLoadClick(Sender: TObject); procedure BitBtnSaveClick(Sender: TObject); procedure BitBtnClearClick(Sender: TObject); procedure ButtonRotateClick(Sender: TObject); procedure ButtonResizeClick(Sender: TObject); end; var Form1: TForm1; implementation {$R *.DFM} uses OB3D; var Object3D : TObject3D; procedure TForm1.FormCreate(Sender: TObject); begin Image1.Canvas.Rectangle (0,0, Image1.Width,Image1.Height); Object3D := TObject3D.Create; end; procedure TForm1.BitBtnLoadClick(Sender: TObject);

Page 56: Materi grafika komputer

Grafika Komputer - Sept 2004 54

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

begin if OpenDialog1.Execute then begin Object3D.Load (OpenDialog1.FileName); Object3D.DrawOnXY (Image1,0,0, Image1.Width,Image1.Height); end; end; procedure TForm1.BitBtnSaveClick(Sender: TObject); begin if SaveDialog1.Execute then Object3D.Save (SaveDialog1.FileName); end; procedure TForm1.BitBtnClearClick(Sender: TObject); begin Image1.Canvas.Rectangle (0,0, Image1.Width,Image1.Height); end; procedure TForm1.ButtonRotateClick(Sender: TObject); var a:real; begin a := StrToFloat(EditAngle.text); case (Sender as TButton).Tag of 1 : Object3D.RotateX (a); 2 : Object3D.RotateY (a); 3 : Object3D.RotateZ (a); end; Image1.Canvas.Rectangle (0,0, Image1.Width,Image1.Height); Object3D.DrawOnXY (Image1,0,0, Image1.Width,Image1.Height); end; procedure TForm1.ButtonResizeClick(Sender: TObject); begin Object3D.Resize (StrToFloat(EditResize.text)); Image1.Canvas.Rectangle (0,0, Image1.Width,Image1.Height); Object3D.DrawOnXY (Image1,0,0, Image1.Width,Image1.Height); end;

Page 57: Materi grafika komputer

Grafika Komputer - Sept 2004 55

Unit berikut berisi struktur data beserta operasinya dari obyek 3D. Lengkapi procedure Save.

OB3D.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

unit OB3D; interface uses ExtCtrls; const MAX_VERTEX = 30; MAX_FACE = 20; MAX_VERTEX_PER_FACE = 20; type TVertex = record x,y,z : real; end; TObject3D = class private nVertexs, nFaces : byte; Vertex : array [1..MAX_VERTEX] of TVertex; Face : array [1..MAX_FACE, 1..MAX_VERTEX_PER_FACE] of byte; nVertexFace : array [1..MAX_FACE] of byte; public constructor Create; destructor Destroy; procedure Load (FileName:string); procedure Save (FileName:string); procedure Normal (var Lx,Ly,Lz:real); procedure DrawOnXY (var Image:TImage; x1,y1,x2,y2:integer); procedure RotateX (T:real); procedure RotateY (T:real); procedure RotateZ (T:real); procedure ReSize (S:real); end;

Page 58: Materi grafika komputer

Grafika Komputer - Sept 2004 56

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

IMPLEMENTATION constructor TObject3D.Create; begin nVertexs := 0; nFaces := 0; end; destructor TObject3D.Destroy; begin end; procedure TObject3D.Load (FileName:string); var FL:TextFile; i,j:byte; begin AssignFile(FL,FileName); Reset(FL); ReadLn(FL, nVertexs, nFaces); ReadLn(FL); for i:=1 to nVertexs do with Vertex[i] do ReadLn(FL, x,y,z); ReadLn(FL); for i:=1 to nFaces do begin Read(FL,nVertexFace[i]); for j:=1 to nVertexFace[i] do Read(FL, Face[i,j]); Face[i,nVertexFace[i]+1] := Face[i,1]; ReadLn(FL); end; CloseFile(FL); end; procedure TObject3D.Save (FileName:string); begin … … end; procedure TObject3D.Normal (var Lx,Ly,Lz:real); var i:byte; MinX,MinY,MinZ:real; begin MinX := Vertex[1].x;

Page 59: Materi grafika komputer

Grafika Komputer - Sept 2004 57

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128

MinY := Vertex[1].y; MinZ := Vertex[1].z; for i:=2 to nVertexs do begin if Vertex[i].x < MinX then MinX := Vertex[i].x; if Vertex[i].y < MinY then MinY := Vertex[i].y; if Vertex[i].z < MinZ then MinZ := Vertex[i].z; end; Lx:=0; Ly:=0; Lz:=0; for i:=1 to nVertexs do begin Vertex[i].x := Vertex[i].x - MinX; Vertex[i].y := Vertex[i].y - MinY; Vertex[i].z := Vertex[i].z - MinZ; if Vertex[i].x > Lx then Lx := Vertex[i].x; if Vertex[i].y > Ly then Ly := Vertex[i].y; if Vertex[i].z > Lz then Lz := Vertex[i].z; end; end; procedure TObject3D.DrawOnXY (var Image:TImage; x1,y1,x2,y2:integer); var i,j:byte; xa,xb,ya,yb:integer; Lx,Ly,Lz:real; MarginX,MarginY:integer; begin Normal (Lx,Ly,Lz); MarginX := Round((x2-x1+1)-Lx) div 2; MarginY := Round((y2-y1+1)-Ly) div 2; for i:=1 to nFaces do for j:=1 to nVertexFace[i] do begin xa := Round (Vertex[Face[i,j]].x) + MarginX; xb := Round (Vertex[Face[i,j+1]].x) + MarginX; ya := Round (Vertex[Face[i,j]].y) + MarginY; yb := Round (Vertex[Face[i,j+1]].y) + MarginY; Image.Canvas.MoveTo (xa,ya); Image.Canvas.LineTo (xb,yb);

Page 60: Materi grafika komputer

Grafika Komputer - Sept 2004 58

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170171 172

end; end; procedure TObject3D.RotateX (T:real); var i:byte; yy,zz:real; begin T := T/180*PI; for i:=1 to nVertexs do with Vertex[i] do begin yy := y*Cos(T) + z*Sin(T); zz := -y*Sin(T) + z*Cos(T); y:=yy; z:=zz; end; end; procedure TObject3D.RotateY (T:real); var i:byte; xx,zz:real; begin T := T/180*PI; for i:=1 to nVertexs do with Vertex[i] do begin xx := x*Cos(T) + z*Sin(T); zz := -x*Sin(T) + z*Cos(T); x:=xx; z:=zz; end; end; procedure TObject3D.RotateZ (T:real); var i:byte; xx,yy:real; begin T := T/180*PI; for i:=1 to nVertexs do with Vertex[i] do begin xx := x*Cos(T) + y*Sin(T); yy := -x*Sin(T) + y*Cos(T); x:=xx; y:=yy; end; end; procedure TObject3D.ReSize (S:real); var i:byte;

Page 61: Materi grafika komputer

Grafika Komputer - Sept 2004 59

173 174 175 176 177 178 179 180 181 182

begin for i:=1 to nVertexs do begin Vertex[i].x := Vertex[i].x * S; Vertex[i].y := Vertex[i].y * S; Vertex[i].z := Vertex[i].z * S; end; end; end.

Berikut ini contoh struktur obyek 3D yang disimpan dalam file dengan ekstensi 3D. Baris pertama menunjukkan banyaknya vertek dan face. Pada bagian VERTEX terdapat pasangan nilai x, y dan z. Pada bagian FACE kolom pertama menunjukkan banyaknya vertex yang menyusun face dan kolom berikutnya menunjukan nomer vertex penyusun face tersebut.

5 5 VERTEX 0 0 0 0 50 0 50 50 0 50 0 0 25 25 40 FACE 4 1 2 3 4 3 1 2 5 3 2 3 5 3 3 4 5 3 4 1 5

Pengembangan

- Tambahkan fasilitas untuk mengatur warna dan ketebalan garis untuk mengambar obyek,

- Tambahkan fasilitas untuk menyimpan obyek dalam bentuk file bmp.

- Tambahkan fasilitas transformasi lainnya seperti pada program untuk 2D.

Page 62: Materi grafika komputer

Grafika Komputer - Sept 2004 60

Bab

8

Dasar-Dasar Pengolahan Citra Digital

Tujuan Melakukan pengolahan citra digital.

Latihan 8 Susun project untuk mengolah citra digital (format bmp) dengan tampilan utama (FormMain) sebagai berikut:

Pengaturan komponen dalam FormMain sebagai berikut:

Component Property Value Form • Name

• Caption • Color • FormStyle

• FormMain • MyImage 1.0 • clWhite • fsMDIForm

Panel • Name • Panel1

Panel1

Panel2

Gauge1

FormImg

BitBtnUndo

Page 63: Materi grafika komputer

Grafika Komputer - Sept 2004 61

• Align • Caption

• alTop • ‘’ (kosong)

Panel • Name • Align • Caption

• Panel2 • alBottom • ‘’ (kosong)

BitBtn • Name • Glyph

• BitBtnUndo •

Gauge • Name • Align

• Gauge1 • alRight

Dalam FormMain terdapat form anak (FormImg) dengan pengaturan komponen sebagai berikut:

Component Property Value Form • Name

• FormStyle • FormImg • fsMDIChild

Image • Name • Image1

Dalam FormMain terdapat juga komponen non visual OpenPictureDialog, SavePictureDialog dan MainMenu. Struktur menu program dalam MainMenu sebagai berikut:

File Open Image Save Image As Image Convert to Grayscale Invert Color Lightening Exit

Isi event dalam FormMain dan dan FormImg sebagai berikut:

F_Main.PAS 01 02 03 04 05 06 07 08

type TFormMain = class(TForm) MainMenu1: TMainMenu; MenuFile: TMenuItem; MenuFileOpen: TMenuItem; MenuFileSave: TMenuItem; MenuImage: TMenuItem; MenuImageGrayscale: TMenuItem;

Page 64: Materi grafika komputer

Grafika Komputer - Sept 2004 62

09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

MenuImageInvertColor: TMenuItem; MenuImageLighten: TMenuItem; MenuExit: TMenuItem; Panel1: TPanel; Panel2: TPanel; ImageBuffer: TImage; Gauge1: TGauge; BitBtnUndo: TBitBtn; OpenPictureDialog1: TOpenPictureDialog; SavePictureDialog1: TSavePictureDialog; procedure FormShow(Sender: TObject); procedure MenuFileOpenClick(Sender: TObject); procedure MenuFileSaveClick(Sender: TObject); procedure MenuExitClick(Sender: TObject); procedure MenuImageClick(Sender: TObject); procedure BitBtnUndoClick(Sender: TObject); end; var FormMain: TFormMain; implementation {$R *.DFM} uses F_Img, F_Light, ImgProc; procedure TFormMain.FormShow(Sender: TObject); var s:string; begin FormImg.Left := 2; FormImg.Top := 2; GetDir (0, s); OpenPictureDialog1.InitialDir := s; SavePictureDialog1.InitialDir := s; end; procedure TFormMain.MenuExitClick(Sender:TObject); begin Close; end;

Page 65: Materi grafika komputer

Grafika Komputer - Sept 2004 63

53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

procedure TFormMain.MenuFileOpenClick(Sender: TObject); begin if OpenPictureDialog1.Execute then begin FormImg.OpenImage(OpenPictureDialog1.FileName); MenuFileSave.Enabled := true; MenuImage.Enabled := true; end; end; procedure TFormMain.MenuFileSaveClick(Sender:TObject); begin if SavePictureDialog1.Execute then begin FormImg.Image1.Picture.SaveToFile (SavePictureDialog1.FileName); FormImg.Caption := ExtractFileName (SavePictureDialog1.FileName); end; end; procedure TFormMain.MenuImageClick(Sender:TObject); begin ImageBuffer.Picture.Graphic := FormImg.Image1.Picture.Graphic; FormImg.Image1.Canvas.Pen.Mode := pmCOPY; if Sender=MenuImageGrayscale then ImgConvertToGrayscale (FormImg.Image1, Gauge1) else if Sender=MenuImageInvertColor then ImgInvertColor (FormImg.Image1, Gauge1) else if Sender=MenuImageLighten then FormLighten.ShowModal; end; procedure TFormMain.BitBtnUndoClick(Sender:TObject); begin FormImg.Image1.Picture.Graphic := ImageBuffer.Picture.Graphic; end;

Page 66: Materi grafika komputer

Grafika Komputer - Sept 2004 64

F_Img.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

type TFormImg = class(TForm) Image1: TImage; public procedure OpenImage (FileName: string); end; var FormImg: TFormImg; implementation uses F_main,ImgProc; {$R *.DFM} procedure TFormImg.OpenImage (FileName: string); begin Caption := ExtractFileName (FileName); Image1.Picture.LoadFromFile (FileName); WindowState := wsNormal; ClientWidth := Image1.Width; ClientHeight := Image1.Height; end;

Menu Convert to Grayscale dan Invert Color menghasilkan citra berikut:

Convert Grayscale

Invert Color

Page 67: Materi grafika komputer

Grafika Komputer - Sept 2004 65

Menu Lightening menampilkan FormLighten sebagai berikut:

Isi event dalam FormLighten sebagai berikut:

F_Light.PAS 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

type TFormLighten = class(TForm) GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; RadioButtonBrightMul: TRadioButton; RadioButtonBrightPow: TRadioButton; SpinEditUpDown: TSpinEdit; EditBrightnessFactor: TEdit; ButtonGoLD: TButton; ButtonGoBrightness: TButton; BitBtnClose: TBitBtn; BitBtnUndo: TBitBtn; CheckBoxR: TCheckBox; CheckBoxG: TCheckBox; CheckBoxB: TCheckBox; Label1: TLabel; Label2: TLabel; procedure ButtonGoLDClick(Sender: TObject); procedure ButtonGoBrightnessClick(Sender:TObject);

ButtonGoBrightness

SpinEditUpDown

EditBrightnessFactor

ButtonGoLD

Page 68: Materi grafika komputer

Grafika Komputer - Sept 2004 66

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

procedure BitBtnUndoClick(Sender: TObject); end; var FormLighten: TFormLighten; implementation uses F_Img, F_Main, ImgProc; {$R *.DFM} procedure TFormLighten.ButtonGoLDClick(Sender:TObject); var r,g,b: integer; begin r:=0; g:=0; b:=0; if CheckBoxR.Checked then r := SpinEditUpDown.Value; if CheckBoxG.Checked then g := SpinEditUpDown.Value; if CheckBoxB.Checked then b := SpinEditUpDown.Value; ImgAdd (FormImg.Image1, r,g,b, FormMain.Gauge1); end; procedure TFormLighten.ButtonGoBrightnessClick (Sender:TObject); var r,g,b: real; begin r:=1; g:=1; b:=1; if CheckBoxR.Checked then r := StrToFloat(EditBrightnessFactor.Text); if CheckBoxG.Checked then g := StrToFloat(EditBrightnessFactor.Text); if CheckBoxB.Checked then b := StrToFloat(EditBrightnessFactor.Text); if RadioButtonBrightMul.Checked then ImgMul (FormImg.Image1, r,g,b, FormMain.Gauge1) else ImgPow (FormImg.Image1, r,g,b, FormMain.Gauge1) end;

Page 69: Materi grafika komputer

Grafika Komputer - Sept 2004 67

68 69 70 71 72

procedure TFormLighten.BitBtnUndoClick(Sender:TObject); begin FormImg.Image1.Picture.Graphic := FormMain.ImageBuffer.Picture.Graphic; end;

Beberapa citra hasil proses dalam FormLighten adalah sebagai berikut:

Lighten -50

Lighten 50

Brightness Multiply 1.5

Brightness Power 1.3

Semua procedure pengolahan citra diletakkan dalam unit ImgProc.

ImgProc.PAS 01 02 03 04 05 06

unit ImgProc; interface uses WINPROCS, Graphics, ExtCtrls, Gauges;

Page 70: Materi grafika komputer

Grafika Komputer - Sept 2004 68

07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

function RgbToGray (Clr:TColor) : byte; function ByteRange (r:double) : byte; procedure ImgConvertToGrayscale ( var Image1:TImage; var Gauge:TGauge); procedure ImgInvertColor (var Image1:TImage; var Gauge:TGauge); procedure ImgAdd (var Image1:TImage; dr,dg,db:integer; var Gauge:TGauge); procedure ImgMul (var Image1:TImage; mr,mg,mb:real; var Gauge:TGauge); procedure ImgPow (var Image1:TImage; pr,pg,pb:real; var Gauge:TGauge); implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange (r:double) : byte; begin if r<0 then ByteRange:=0 else if r>255 then ByteRange:=255 else ByteRange:=Round(r); end; function Pow (x,n:double) : double; begin if x=0 then Pow := 0 else Pow := Exp (n*Ln(x)); end; procedure GaugeStart (var Gauge:TGauge; n:longint); begin Gauge.MaxValue := n; Gauge.Progress := 0; end; procedure GaugeStop (var Gauge:TGauge);

Page 71: Materi grafika komputer

Grafika Komputer - Sept 2004 69

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94

begin Gauge.Progress := Gauge.MaxValue; end; procedure GaugeProgress (var Gauge:TGauge; var Image1:TImage; n:longint); begin if n mod 20 = 0 then begin Image1.Repaint; Gauge.Progress := n; end; end; function RgbToGray (Clr:TColor) : byte; var r,g,b:byte; begin r := GetRValue(Clr); g := GetGValue(Clr); b := GetBValue(Clr); RgbToGray := ByteRange (r*PercentR + g*PercentG + b*PercentB); end; procedure ImgConvertToGrayscale ( var Image1:TImage; var Gauge:TGauge); var x,y:integer; Clr:TColor; ClrGray:byte; begin GaugeStart (Gauge, Image1.Width-1); for x:=0 to Image1.Width-1 do begin for y:=0 to Image1.Height-1 do begin Clr := Image1.Canvas.Pixels[x,y]; ClrGray := RgbToGray (Clr); Image1.Canvas.Pixels[x,y] := RGB (ClrGray,ClrGray,ClrGray); end; GaugeProgress (Gauge, Image1, x); end; GaugeStop (Gauge); end; procedure ImgInvertColor (var Image1:TImage;

Page 72: Materi grafika komputer

Grafika Komputer - Sept 2004 70

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138

var Gauge:TGauge); var x,y:integer; Clr:TColor; r,g,b:byte; begin GaugeStart (Gauge, Image1.Width-1); for x:=0 to Image1.Width-1 do begin for y:=0 to Image1.Height-1 do begin Clr := Image1.Canvas.Pixels[x,y]; r := 255 - GetRValue(Clr); g := 255 - GetGValue(Clr); b := 255 - GetBValue(Clr); Image1.Canvas.Pixels[x,y] := RGB (r,g,b); end; GaugeProgress (Gauge, Image1, x); end; GaugeStop (Gauge); end; procedure ImgAdd (var Image1:TImage; dr,dg,db:integer; var Gauge:TGauge); var x,y:integer; Clr:TColor; r,g,b:byte; begin GaugeStart (Gauge, Image1.Width-1); for x:=0 to Image1.Width-1 do begin for y:=0 to Image1.Height-1 do begin Clr := Image1.Canvas.Pixels[x,y]; r := ByteRange (GetRValue(Clr) + dr); g := ByteRange (GetGValue(Clr) + dg); b := ByteRange (GetBValue(Clr) + db); Image1.Canvas.Pixels[x,y] := RGB (r,g,b); end; GaugeProgress (Gauge, Image1, x); end; GaugeStop (Gauge); end; procedure ImgMul (var Image1:TImage; mr,mg,mb:real; var Gauge:TGauge); var x,y:integer; Clr:TColor; r,g,b:byte;

Page 73: Materi grafika komputer

Grafika Komputer - Sept 2004 71

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170171 172 173 174 175 176 177

begin GaugeStart (Gauge, Image1.Width-1); for x:=0 to Image1.Width-1 do begin for y:=0 to Image1.Height-1 do begin Clr := Image1.Canvas.Pixels[x,y]; r := ByteRange (GetRValue(Clr) * mr); g := ByteRange (GetGValue(Clr) * mg); b := ByteRange (GetBValue(Clr) * mb); Image1.Canvas.Pixels[x,y] := RGB (r,g,b); end; GaugeProgress (Gauge, Image1, x); end; GaugeStop (Gauge); end; procedure ImgPow (var Image1:TImage; pr,pg,pb:real; var Gauge:TGauge); var x,y:integer; Clr:TColor; r,g,b:byte; begin GaugeStart (Gauge, Image1.Width-1); for x:=0 to Image1.Width-1 do begin for y:=0 to Image1.Height-1 do begin Clr := Image1.Canvas.Pixels[x,y]; r := ByteRange (Pow (GetRValue(Clr), pr)); g := ByteRange (Pow (GetGValue(Clr), pg)); b := ByteRange (Pow (GetBValue(Clr), pb)); Image1.Canvas.Pixels[x,y] := RGB (r,g,b); end; GaugeProgress (Gauge, Image1, x); end; GaugeStop (Gauge); end; end.