project strukdat finish

35
Tugas Mandiri Struktur Data Diserahkan kepada: Sunarya D. Marwah (D0923) Tanggal: 12-06-2012 Kelas 02PRT 1501150303 Alfon Lavinski 1501152630 Denny Surya 1501151445 Hansel Wirianto 1501157215 Kenneth Halim 1501151426 Martin Sendra S 1501170192 Vicky 1

Upload: rico-sendra-s

Post on 24-Jul-2015

39 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Project Strukdat Finish

Tugas Mandiri Struktur Data

Diserahkan kepada:

Sunarya D. Marwah (D0923)

Tanggal: 12-06-2012

Kelas 02PRT

1501150303 Alfon Lavinski

1501152630 Denny Surya

1501151445 Hansel Wirianto

1501157215 Kenneth Halim

1501151426 Martin Sendra S

1501170192 Vicky

DAFTAR ISI

1

Page 2: Project Strukdat Finish

Daftar Isi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Kata Pengantar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Isi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11

Penutup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Daftar Pustaka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15

Lampiran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16

KATA PENGANTAR

2

Page 3: Project Strukdat Finish

Puji dan Syukur kami panjat kehadirat Tuhan Yang Maha Esa yang telah memberikan rahmat dan karunia-Nya kepada kami sehingga kami berhasil menyelesaikan tugas akhir mata kuliah Struktur Data ini dengan baik dan tepat waktu.

Tugas akhir mata kuliah Struktur Data ini berisikan tentang bagaimana penggunaan Linked List dalam Chain Code.

Dalam penulisan tugas akhir ini kami merasa masih ada kekurangan, untuk itu kritik dan saran dari semua pihak kami harapkan untuk menyempurnakan tugas akhir ini.

Kami juga mengucapkan terima kasih kepada semua pihak yang telah berperan serta dalam menyelesaikan tugas akhir ini dari awal hingga akhir, mulai dari teman-teman dan Bapak Sunarya yang sangat terbuka dalam melakukan diskusi.

Jakarta, Juni 2012

Penyusun

3

Page 4: Project Strukdat Finish

PENDAHULUAN

Tampilan yang direpresentasikan dengan chain-code adalah jenis citra yang diwakili

oleh batas luar (boundary), karena ada jenis lain dari tampilan yang diwakili oleh bidang

(region). Ada keuntungan dan kerugian dari representasi tampilan dengan dua cara tersebut,

pembahasan tersebut diluar jangkauan tulisan ini, disini hanya akan dibahas bagaimana

membuat tampilan dengan chain-code dan operasi-operasi apa saja yang dapat dilakukan

pada tampilan tersebut. Tujuan dari tulisan ini adalah untuk menunjukan bebarapa algoritma

yang cukup menarik dan untuk menunjukan pemakaian simpul-berantai (linked-list).

Chain-code

Chain-code atau kadang-kadang disebut juga dengan crack-code [3], adalah suatu

kode yang serupa dengan arah mata-angin, hanya saja arah tersebut tidak dinyatakan dengan

Utara, Timur, Selatan dan Barat, melainkan dengan kode angka, yaitu : 0, 1, 2, 3, 4, 5, 6 dan

7. Chain code diperkenalkan oleh Freeman [1] , dimana garis yang tidak beraturan dapat

dikuantisasi dan diberi kode tersebut. Tetapi dalam proyek kali ini hanya digunakan 4 arah,

atas, kanan, bawah, dan kiri yang dinyatakan dengan kode 1, 2, 3, 4.

Gambar 1. Chain-Code Gambar 1.1

Dengan menggunakan kode arah seperti telihat diatas, maka kode :

0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 0 0 0

sudah mewakili suatu chain-code yang membentuk citra segi-empat. Kode arah tersebut dapat

disimpan dalam bentuk simpul-berantai (linked-list). Simpul-berantai yang digunakan tidak

harus simpul pointer-ganda (doubly linked-list) tetapi cukup dengan simpul tunggal.

4

0

26

45 3

17 1

2

3

4

Page 5: Project Strukdat Finish

Operasi-operasi yang dapat dilakukan pada Chain-code.

Setelah citra digambar dengan Chain-code, maka terhadap citra tersebut dapat

dilakukan operasi-operasi sebagai berikut :

a. Perhitungan geometris :

- Perhitungan Keliling, Panjang, Lebar dan Luas.

b. Pencocokan gambar/pattern matching

Perhitungan Tinggi dan Lebar.

Misalkan kita punya citra dengan bentuk sebagai berikut :

Gambar 2. Citra dengan kode : 0 0 1 1 2 2 0 2 2 4 4 2 2 3 3 4 6 6 6 6 6 0 6 4 6 6 6 6.

Sekarang dibuat notasi sebagai berikut :

A = a1 + a2 + a3 + . . . + an

nA = C aI , dibaca sebagai : Chain ai dari i= 1 sampai i = n i =1

Untuk bisa mengitung geometris, ai dipecah menjadi dua komponen vertikal dan horizontal,

komponen vertikal disebut aiy dan komponen horizontal disebut aix.

5

Titik Awal

Tinggi

Lebar

Page 6: Project Strukdat Finish

Tabel 1. Komponen X-Y Chain-code

Ai aix aiy

0 0 1

1 1 1

2 1 0

3 1 -1

4 0 -1

5 -1 -1

6 -1 0

7 -1 1

Untuk menghitung Lebar dan Tinggi, Chain-code dilacak dari titik awak hingga

akhir, dengan melakukan perhitungan kumulatif pada setiap kode. Perhitungan kumulatif,

adalah sebagai berikut :

Wi=∑j=1

i

ajx ……….(1a)

Hi=∑j=1

i

ajy ……….(1b)

Lebar = Wi(max) - Wi(min) ………….(2a)

Tinggi = Hi(max) - Hi(min) ...……….(2b)

dengan : i = 0, 1, 2, 3, . . . , n (banyaknya kode didalam Chain-code)

W0 = 0 dan H0 = 0.

sekarang kita gunakan rumus : 1a, 1b, 2a dan 2b. dan nilai pada Tabel 1. untuk menyusun

algoritma Perhitungan Lebar dan Tinggi.

Algoritma Perhitungan Lebar dari Gambar yang dibentuk dengan Chain-Code.

1. W0 0

2. i 1 , kode pertama Chain-code

0. Bila ai = 0 , maka aix 0

Bila ai = 1 , maka aix 1

6

Page 7: Project Strukdat Finish

Bila ai = 2 , maka aix 1

Bila ai = 3 , maka aix 1

Bila ai = 4 , maka aix 0

Bila ai = 5 , maka aix -1

Bila ai = 6 , maka aix -1

Bila ai = 7 , maka aix -1

1. Wi W(i-1) + aix

2. Ulangi 3 dan 4 untuk i i + 1 hingga i = n, kode terakhir Chain-code.

3. Cari Wi(max) dan Wi(min) maka Lebar Wi(max) - Wi(min).

Dengan mengambil contoh citra gambar 2. dengan kode :

0 0 1 1 2 2 0 2 2 4 4 2 2 3 3 4 6 6 6 6 6 0 6 4 6 6 6 : (ada 28 kode : a1 … a28)

Perhitungan Lebar :

W0 = 0

W1 = W0 + a1x = 0 + 0 = 0 W2 = W1 + a2x = 0 + 0 = 0

W3 = W2 + a3x = 0 + 1 = 1 W4 = W3 + a4x = 1 + 1 = 2

W5 = W4 + a5x = 2 + 1 = 3 W6 = W5 + a6x = 3 + 1 = 4

W7 = W6 + a7x = 4 + 0 = 4 W8 = W7 + a8x = 4 + 1 = 5

W9 = W8 + a9x = 5 + 1 = 6 W10 = W9 + a10x = 6 + 0 = 6

W11 = W10 + a11x = 6 + 0 = 6 W12 = W11 + a12x = 6 + 1 = 7

W13 = W12 + a13x = 7 + 1 = 8 W14 = W13 + a14x = 8 + 1 = 9

W15 = W14 + a15x = 9 + 1 = 10 W16 = W15 + a16x = 10 + 0 = 10

W17 = W16 + a17x = 10 - 1 = 9 W18 = W17 + a18x = 9 -1 = 8

W19 = W18 + a19x = 8 -1 = 7 W20 = W19 + a20x = 7 - 1 = 6

W21 = W20 + a21x = 6 - 1 = 5 W22 = W21 + a22x = 5 + 0 = 5

W23 = W22 + a23x = 5 - 1 = 4 W24 = W23 + a24x = 4 + 0 = 4

W25 = W24 + a25x = 4 - 1 = 3 W26 = W25 + a26x = 3 - 1 = 2

W27 = W26 + a27x = 2 - 1 = 1 W28 = W27 + a28x = 1 - 1 = 0

Wi(max) = 10 Wi(min) = 0 Lebar = 10 - 0 = 10

Algoritma Perhitungan Tinggi dari Gambar yang dibentuk dengan Chain-Code.

1. H0 0

2. i 1 , kode pertama Chain-code

7

Page 8: Project Strukdat Finish

3. Bila ai = 0 , maka aiy 1

Bila ai = 1 , maka aiy 1

Bila ai = 2 , maka aiy 0

Bila ai = 3 , maka aiy -1

Bila ai = 4 , maka aiy -1

Bila ai = 5 , maka aiy -1

Bila ai = 6 , maka aiy 0

Bila ai = 7 , maka aiy 1

4. Hi H(I-1) + aiy

5. Ulangi 3 dan 4 untuk i i + 1 hingga I = n, kode terakhir Chain-code.

6. Cari Hi(max) dan Hi(min), maka Tinggi Hi(max) - Hi(min).

Dengan mengambil contoh citra gambar 2, dengan kode :

0 0 1 1 2 2 0 2 2 4 4 2 2 3 3 4 6 6 6 6 6 0 6 4 6 6 6 6 : (ada 28 kode : a1 … a28)

Perhitungan Tinggi :

H0 = 0

H1 = H0 + a1y = 0 + 1 = 1 H2 = H1 + a2y = 1 + 1 = 2

H3 = H2 + a3y = 2 + 1 = 3 H4 = H3 + a4y = 3 + 1 = 4

H5 = H4 + a5y = 4 + 0 = 4 H6 = H5 + a6y = 4 + 0 = 4

H7 = H6 + a7y = 4 + 1 = 5 H8 = H7 + a8y = 5 + 0 = 5

H9 = H8 + a9y = 5 + 0 = 5 H10 = H9 + a10y = 5 - 1 = 4

H11 = H10 + a11y= 4 - 1 = 3 H12 = H11 + a12y = 3 + 0 = 3

H13 = H12 + a13y = 3 + 0 = 3 H14 = H13 + a14y = 3 - 1 = 2

H15 = H14 + a15y = 2 - 1 = 1 H16 = H15 + a16y = 1 - 1 = 0

H17 = H16 + a17y = 0 + 0 = 0 H18 = H17 + a18y = 0 + 0 = 0

H19 = H18 + a19y = 0 + 0 = 0 H20 = H19 + a20y = 0 + 0 = 0

H21 = H20 + a21y = 0 + 0 = 0 H22 = H21 + a22y = 0 + 1 = 1

H23 = H22 + a23y = 1 + 0 = 1 H24 = H23 + a24y = 1 - 1 = 0

H25 = H24 + a25y = 0 + 0 = 0 H26 = H25 + a26y = 0 + 0 = 0

H27 = H26 + a27y = 0 + 0 = 0 H28 = H27 + a28y = 0 + 0 = 0

Hi(max) = 5 Hi(min) = 0 Tinggi = 5 - 0 = 5

Perhitungan Luas.

8

Page 9: Project Strukdat Finish

a1

a4

a7

a10

Untuk menghitung Luas area, perhatikan contoh gambar berikut :

Gambar 3. Chain-code : 0 2 0 2 4 2 4 6 4 6 0 6

Ai = aix (Y(i-1) + 0.5 * aiy) …………(3)

Y(i-1) = Y(i-2) + a(I-1)y ……………..(4)

Luas=∑i=1

n

Ai ……………………..…(5)

Algoritma Perhitungan Luas dari citra yang dibentuk dengan Chain-Code.

1. Luas 0

2. Y0 0

3. i 1 , kode pertama Chain-code

4. Bila ai = 0 , maka aix 0 dan aiy 1

Bila ai = 1 , maka aix 1 dan aiy 0

Bila ai = 2 , maka aix 0 dan aiy -1

Bila ai = 3 , maka aix -1 dan aiy 0

5. Y(i-1) Y(i-2) + a(I-1)y

6. Ai aix (Y(i-1) + 0.5 * aiy)

7. Luas Luas + Ai

8. Ulangi 4, 5, 6 dan 7 untuk i i + 1 hingga i = n, kode terakhir Chain-code.

Dengan mengambil contoh citra gambar 3, dengan kode :

0 2 0 2 4 2 4 6 4 6 0 6: (ada 12 kode : a1 … a12)

Perhitungan Luas :

Y0 = 0 A1 = a1x(Y0 + 0.5 * a1y) = 0(0 + 0.5 * 1) = 0

Y1 = Y0 + a1y = 0 + 1 = 1 A2 = a2x(Y1 + 0.5 * a2y) = 1(1 + 0.5 * 0) = 1

Y2 = Y1 + a2y = 1 + 0 = 1 A3 = a3x(Y2 + 0.5 * a3y) = 0(1 + 0.5 * 1) = 0

9

Page 10: Project Strukdat Finish

64242020

064 6

606365 300 20

Y3 = Y2 + a3y = 1 + 1 = 2 A4 = a4x(Y3 + 0.5 * a4y) = 1(2 + 0.5 * 0) = 2

Y4 = Y3 + a4y = 2 + 0 = 2 A5 = a5x(Y4 + 0.5 * a5y) = 0(2 + 0.5 * -1) = 0

Y5 = Y4 + a5y = 2 - 1 = 1 A6 = a6x(Y5 + 0.5 * a6y) = 1(1 + 0.5 * 0) = 1

Y6 = Y5 + a6y = 1 + 0 = 1 A7 = a7x(Y6 + 0.5 * a7y) = 0(1 + 0.5 * -1) = 0

Y7 = Y6 + a7y = 1 - 1 = 0 A8 = a8x(Y7 + 0.5 * a8y) = -1(0 + 0.5 * 0) = 0

Y8 = Y7 + a8y = 0 + 0 = 0 A9 = a9x(Y8 + 0.5 * a9y) = 0(0 + 0.5 * -1) = 0

Y9 = Y8 + a9y = 0 - 1 = -1 A10 = a10x(Y9 + 0.5 * a10y) = -1(-1 + 0.5 * 0) = 1

Y10 = Y9 + a10y = -1 + 0 = -1 A11 = a11x(Y10 + 0.5 * a11y) = 0(-1 + 0.5 * 0) = 0

Y11 = Y10 + a11y = -1 + 1 = 0 A12 = a12x(Y11 + 0.5 * a12y) = -1(0 + 0.5 * 0) = 0

Luas = A1 + A2 + A3 + A4 + … + A10 + A11 + A12 = 5

Struktur Data

Linked list yang dilaksanakan dengan tipe data record:

type TNode = ^cc;

cc = record

kode : byte;

next : TNode;

end;

var Head : TNode;

sudah cukup untuk menampung data chain codes yang berupa integer atau byte.

Contoh linked-list yang terjadi untuk merepresentasikan Gambar 3. (Chain-code : 0 2

0 2 4 2 4 6 4 6 0 6) adalah:

Gambar 4. Representasi linked-list untuk kode: 0 2 0 2 4 2 4 6 4 6 0 6

Untuk dapat menentukan titik awal chain code didalam suatu koordinat x-y, maka

node pertama dan kedua dapat diisi dengan integer yang berisi koordinat x dan y secara

berurutan.

10

Head

Null

Head

Null

Page 11: Project Strukdat Finish

Gambar 5. Representasi linked-list untuk kode: 0 2 0 2 4 2 4 6 4 6 0 6

dengan node pertama dan kedua berisi data koordinat awal.

11

Page 12: Project Strukdat Finish

ISI

Cara melakukan Pattern Matching dengan menggunakan Chain Codes

Program pattern matching digunakan untuk membandingkan 2 buah pattern. Program

Pattern Matching dilaksanakan dengan menggunakan Visual C yang dijalankan pada

Windows XP atau versi yang lebih baru. Penggunaan Visual C sangat membantu programmer

dan orang awam karena memiliki tampilan yang mudah dimengerti, dan program dapat

dijalankan secara cepat dan praktis, serta tampilan visual yang dibuat oleh program ini dapat

menjadi dasar pengembangan lebih lanjut.

Langkah-langkah penggunaan program:

1. Pertama kali dijalankan, program akan membuka halaman menu yang terdiri dari:

2. Halaman draw. Kita dapat menggambar sebuah bentuk menggunakan w, a, s, dan d.

Untuk membuat gambar ulang, dapat digunakan reset dengan trigger r.

12

Page 13: Project Strukdat Finish

3. Setelah gambar selesai dibuat, program akan menunjukkan chain code, lalu di-

kalkulasi lebar (horizontal), tinggi (vertikal), dan luasnya. Kemudian program akan

bertanya untuk melakukan save chain code, dan data geometrisnya.

4. Untuk membuat gambar baru/gambar kedua (untuk menjalankan matching), harus

dilakukan reset.

13

Page 14: Project Strukdat Finish

5. Ulangi langkah menggambar untuk gambar kedua. Kemudian lakukan load untuk

mengambil data sebelumnya untuk dibandingkan dengan gambar kita yang

kedua/baru.

6. Matching, untuk menunjukkan perbandingan data geometris dan persentase kemiripan

antara kedua gambar.

14

Page 15: Project Strukdat Finish

PENUTUP

Dengan menggunakan chain code, suatu gambar dapat dibentuk dan dihitung dengan

mudah. Chain code dapat mengoptimalkan kinerja komputer, dimana untuk melakukan load

gambar, sebuah komputer cukup menerima chain code, dan dapat membentuk suatu

visualisasi objek dengan sendirinya. Program ini mampu menyimpan dan membuka data

dengan mudah dan cepat, serta terintegrasi dengan notepad. Akan sangat memudahkan user

membuat sebuah gambar di notepad, mengingat notepad adalah sebuah program text-based.

Penghitungan dan proses gambar akan menjadi lebih cepat dan dapat meningkatkan kinerja

user.

Melihat kelebihannya, chain code menjadi prospek yang sangat bagus untuk program-

program selanjutnya. Chain code dapat diimplementasikan di program-program lainnya dan

akan menjadi fenomena baru dalam penyimpanan dan presentasi sebuah data.

15

Page 16: Project Strukdat Finish

DAFTAR PUSTAKA

1. Freeman, Herbert, “A Review of Relevant Problems in the Processing of Line

Drawing Data” in Automatic Interpretation and Classification of Images, Academic

Press, Inc. (1969).

2. Freeman, Herbert. “Computer Processing of Line Drawing Images” in Computing

Surveys, March, Vol. 6, No. 1, pp 472-474, (1974)

3. Rosenfeld, Azriel and Kak, A.C. “Digital Picture Processing”, Vol.2 . Academic

Press, Inc. (1982).

4. Djajaprawira, Sunarya. “An Integrated System for Conversion of Images

Representations”, A Research Study in Asian Institute of Technology, Bangkok-

Thailand (1987)

16

Page 17: Project Strukdat Finish

LAMPIRAN

Coding Program dengan Visual C

#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>

FILE *file; //variabel file untuk save dan load char canvas[23][79],canvas2[23][79],code; //variabel canvas sebagai penyedia tempat gambarint x,y,x2,y2,flag=1; // x & y & x2 & y2 sebagai koordinat,flag sebagai penanda bahwa gambar telah selesai digambar (kembali ke titik awal)int wimax=0,wimin=0,himax=0,himin=0; // variabel untuk menghitung lebar dan tinggi patternint lebar,tinggi,keliling=0,luas=0; int lebar2,tinggi2,keliling2=0,luas2=0;

struct picture{

int Ai,Aix,Aiy; // Ai untuk chain codes, Aix & Aiy sebagai penampung nilai koordinat arah tertentu

struct picture *next;}*head,*tail,*curr; //struct gambar 1

struct picture2{

int Ai,Aix,Aiy; // Ai untuk chain codes, Aix & Aiy sebagai penampung nilai koordinat arah tertentu

struct picture2 *next;}*head2,*tail2,*curr2; //struct gambar 2

//void instruction untuk memberikan informasi tombol pada saat membuat gambarvoid instruction(){

printf(" W = Up\tA = Left\tS = Down\tD = Right\tR = Reset\n");}

//void push untuk memasukkan nilai Ai, Aix, & Aiy ke dalam single linked listvoid push(int Ai,int Aix,int Aiy){

curr=(struct picture*)malloc(sizeof(struct picture));curr->Ai=Ai;curr->Aix=Aix;curr->Aiy=Aiy;if(!head){

head=tail=curr;}else{

tail->next = curr;tail=curr;

}

17

Page 18: Project Strukdat Finish

tail->next=NULL;}

//void push2 untuk memasukkan nilai Ai, Aix, & Aiy ke dalam single linked listvoid push2(int Ai,int Aix,int Aiy){

curr2=(struct picture2*)malloc(sizeof(struct picture2));curr2->Ai=Ai;curr2->Aix=Aix;curr2->Aiy=Aiy;if(!head2){

head2=tail2=curr2;}else{

tail2->next = curr2;tail2=curr2;

}tail2->next=NULL;

}

//void draw untuk menggambar gambar pertamavoid draw(){

for(int i=0;i<23;i++){

for(int j=0;j<80;j++)printf("%c",canvas[i][j]);

}}

//void draw2 untuk menggambar gambar keduavoid draw2(){

for(int i=0;i<23;i++){

for(int j=0;j<80;j++)printf("%c",canvas2[i][j]);

}}

//void save untuk menyimpan chain code, luas, lebar ,tinggi, keliling ke data.txtvoid save(){

file=fopen("data.txt","w");curr=head;while(curr){

fprintf(file,"%d",curr->Ai);curr=curr->next;

}fprintf(file," %d %d %d %d",lebar,tinggi,luas,keliling);fclose(file);

}

//void addpicture untuk menerima inputan dari keyboard oleh user pada saat menggambar

18

Page 19: Project Strukdat Finish

void addpicture(int *flag){

int i,j;code=getch();if(code=='w' || code=='W') // w/W untuk arah ke atas{

if(canvas[x-1][y]==' ')// jika koordinat di atas koordinat terakhir tidak ada '*',maka user dapat menggambar ke atas

{x--;push(0,0,1);canvas[x][y]='*';system("cls");draw();instruction();

}else {

i=x-1,j=y;if(i==12 && j==40) // cek apakah arah atas yang

ingin dituju merupakan titik awal {

push(0,0,1);printf("Done!");*flag+=1;

}else //jika bukan titik awal, maka koordinat

tersebut tidak dapat diisi.{

system("cls");draw();instruction();printf("\nCant draw there!!");

}}

}else if(code=='a' || code=='A') // a/A untuk arah ke kiri{

if(canvas[x][y-1]==' ')// jika koordinat di kiri koordinat terakhir tidak ada '*',maka user dapat menggambar ke kiri

{y--;push(6,-1,0);canvas[x][y]='*';system("cls");draw();instruction();

}else{

i=x,j=y-1;if(i==12 && j==40)// cek apakah arah kiri yang

ingin dituju merupakan titik awal {

push(6,-1,0);printf("Done!");*flag+=1;

}else//jika bukan titik awal, maka koordinat

tersebut tidak dapat diisi.{

system("cls");draw();instruction();printf("\nCant draw there!!");

19

Page 20: Project Strukdat Finish

}}

}else if(code=='s' || code=='S') // s/S untuk arah ke bawah{

if(canvas[x+1][y]==' ')// jika koordinat di atas koordinat terakhir tidak ada '*',maka user dapat menggambar ke bawah

{x++;push(4,0,-1);canvas[x][y]='*';system("cls");draw();instruction();

}else{

i=x+1,j=y;if(i==12 && j==40) // cek apakah arah bawah yang

ingin dituju merupakan titik awal{

push(4,0,-1);printf("Done!");*flag+=1;

}else //jika bukan titik bawah, maka koordinat

tersebut tidak dapat diisi.{

system("cls");draw();instruction();printf("\nCant draw there!!");

}}

}else if(code=='d' || code=='D') // d/D untuk arah ke kanan{

if(canvas[x][y+1]==' ') // jika koordinat di atas koordinat terakhir tidak ada '*',maka user dapat menggambar ke kanan

{y++;push(2,1,0);canvas[x][y]='*';system("cls");draw();instruction();

}else {

i=x,j=y+1;if(i==12 && j==40) // cek apakah arah kanan yang

ingin dituju merupakan titik awal{

push(2,1,0);printf("Done!");*flag+=1;

}else //jika bukan titik awal, maka koordinat

tersebut tidak dapat diisi.{

system("cls");draw();instruction();

20

Page 21: Project Strukdat Finish

printf("\nCant draw there!!");}

}}else if(code=='r' || code=='R') // r/R untuk mereset gambar {

while(head){

curr=head;head=head->next;free(curr);fflush(stdin);

}for(int i=0;i<23;i++){

canvas[i][0]=canvas2[i][0]=219;for(int j=1;j<80;j++){

if(i==0 || i==22){

canvas[i][j]=canvas2[i][j]=219;}elsecanvas[i][j]=canvas2[i][j]=' ';

}}system("cls");keliling=0;x=12;y=40;canvas[x][y]='*';draw();instruction();

}}

//void calculate untuk menghitung lebar,tinggi, luasvoid calculate(){

int w=0,h=0,y=0; //w sebagai penampung lebar sementara,h sebagai penampung tinggi sementara, y digunakan untuk membantu perhitungan luas

lebar=0; tinggi=0;luas=0;

// menghitung lebarcurr=head;while(curr){

w=w+curr->Aix;if(w>wimax)

wimax=w;else if(w<wimin)

wimin=w;curr=curr->next;

}

//menghitung tinggicurr=head;while(curr){

h=h+curr->Aiy;if(h>himax)

himax=h;else if(h<himin)

himin=h;curr=curr->next;

21

Page 22: Project Strukdat Finish

}

//menghitung luascurr=head;y=0;while(curr){

luas=luas+(curr->Aix*(y+(0.5*curr->Aiy)));y=y+curr->Aiy;curr=curr->next;

}lebar=(wimax-wimin); //lebar didapat dari wimax-wimintinggi=(himax-himin);//tinggi didapat dari himax-himinif(luas<0) luas=luas*(-1); // jika nilai luas di bawah 0, maka luas

dikali -1

printf("\nLebar=%d",lebar);printf("\nTinggi=%d",tinggi);printf("\nKeliling=%d",keliling);printf("\nLuas=%d",luas);char pil_save;

do{printf("\n\nDo you want to save the pattern [y/n]: ");scanf("%c",&pil_save); fflush(stdin);

}while(pil_save != 'y' && pil_save != 'n');if (pil_save=='y') save();

}

//void load untuk mengambil data dari data.txtvoid load(){

char temp[2000];file=fopen("data.txt","r");fscanf(file,"%s %d %d %d %d\

n",temp,&lebar2,&tinggi2,&luas2,&keliling2);fclose(file);x2=12,y2=40;for(int i=0;i<strlen(temp);i++){

if(temp[i]=='0') {push2(0,0,1);x2--;canvas2[x2][y2]='*';}else if(temp[i]=='2') {push2(2,1,0);y2++;canvas2[x2][y2]='*';}else if(temp[i]=='4') {push2(4,0,-1);x2++;canvas2[x2][y2]='*';}else if(temp[i]=='6') {push2(6,-1,0);y2--;canvas2[x2][y2]='*';}

}}

//void popAll untuk menghapus semua data pada gambar 1 dan gambar 2void popAll(){

lebar=0,tinggi=0,keliling=0,luas=0,lebar2=0,tinggi2=0,keliling2=0,luas2=0,wimax=0,wimin=0,himax=0,himin=0;

while(head){

curr=head;head=head->next;free(curr);fflush(stdin);

}while(head2)

22

Page 23: Project Strukdat Finish

{curr2=head2;head2=head2->next;free(curr2);

}for(int i=0;i<23;i++){

canvas[i][0]=canvas2[i][0]=219;for(int j=1;j<80;j++){

if(i==0 || i==22){

canvas[i][j]=canvas2[i][j]=219;}elsecanvas[i][j]=canvas2[i][j]=' ';

}}

}

//void matching untuk menghitung persentase seberapa mirip gambar 1 & gambar 2void matching(){ int persentase=100,selisih_lebar=0,selisih_tinggi=0,selisih_luas=0,selisih_keliling=0;

selisih_lebar = lebar - lebar2;selisih_lebar<0 ? selisih_lebar*= (-1) : selisih_lebar;if(selisih_lebar>0 && selisih_lebar<=10) persentase -= 1;else if(selisih_lebar>10 && selisih_lebar<=20) persentase -= 3;else if(selisih_lebar>20 && selisih_lebar<=30) persentase -= 5;else if(selisih_lebar>30 && selisih_lebar<=40) persentase -= 7;else if (selisih_lebar>40 && selisih_lebar<50) persentase -=10;

selisih_tinggi = tinggi - tinggi2;selisih_tinggi<0 ? selisih_tinggi*= (-1) : selisih_tinggi;if(selisih_tinggi>0 && selisih_tinggi<=10) persentase -= 1;else if(selisih_tinggi>10 && selisih_tinggi<=20) persentase -= 3;else if(selisih_tinggi>20 && selisih_tinggi<=30) persentase -= 5;else if(selisih_tinggi>30 && selisih_tinggi<=40) persentase -= 7;else if (selisih_tinggi>40 && selisih_tinggi<50) persentase -=10;

selisih_luas = luas-luas2;selisih_luas<0 ? selisih_luas*= (-1) : selisih_luas;if(selisih_luas>0 && selisih_luas<=10) persentase -= 1;else if(selisih_luas>10 && selisih_luas<=20) persentase -= 3;else if(selisih_luas>20 && selisih_luas<=30) persentase -= 5;else if(selisih_luas>30 && selisih_luas<=40) persentase -= 7;else if (selisih_luas>40 && selisih_luas<50) persentase -=10;

selisih_keliling = keliling - keliling2;selisih_keliling<0 ? selisih_keliling*= (-1) : selisih_keliling;if(selisih_keliling>0 && selisih_keliling<=10) persentase -= 1;else if(selisih_keliling>10 && selisih_keliling<=20) persentase -= 3;else if(selisih_keliling>20 && selisih_keliling<=30) persentase -= 5;else if(selisih_keliling>30 && selisih_keliling<=40) persentase -= 7;else if (selisih_keliling>40 && selisih_keliling<50) persentase -=10;

selisih_keliling == 0 && selisih_luas ==0 ? persentase : persentase -= 60;

23

Page 24: Project Strukdat Finish

printf("+--------------------------------+\n");printf("| Pattern | 1 | 2 |\n");printf("|---------------------------------\n");printf("| Lebar | %-9d| %-9d|\n",lebar,lebar2);printf("| Tinggi | %-9d| %-9d|\n",tinggi,tinggi2);printf("| Luas | %-9d| %-9d|\n",luas,luas2);printf("| Keliling | %-9d| %-9d|\n",keliling,keliling2);printf("+--------------------------------+\n");printf("Persentase Pattern Matching pattern 1 & pattern 2: %d %

%",persentase);}

//void about untuk menampilkan nama anggota kelompok struktur data pembuat program project pattern matchingvoid about(){

system("cls");for(int kolom_atas = 0 ;kolom_atas<79;kolom_atas++) printf("=");printf("\n=\t\t\t Program Pattern Matching\t\t\t =\n");for(int kolom_bawah = 0 ;kolom_bawah<79;kolom_bawah++) printf("=");printf("\n\nKelompok Struktur Data 02 PRT\n\n");printf("1. Alfon Lavinski - 1501150303\n");printf("2. Denny Surya - 1501152630\n");printf("3. Hansel Wirianto - 1501151445\n");printf("4. Kenneth Halim - 1501157215\n");printf("5. Martin Sendra - 1501151426\n");printf("6. Vicky - 1501170192\n");

}

void main(){

int pilih;//looping di bawah bertujuan untuk mengisi kondisi awal seluruh

kanvas 1 & kanvas 2 for(int i=0;i<23;i++){

canvas[i][0]=canvas2[i][0]=219; for(int j=1;j<80;j++){

if(i==0 || i==22){

canvas[i][j]=canvas2[i][j]=219;}elsecanvas[i][j]=canvas2[i][j]=' ';

}}

do{

system("cls");for(int kolom_atas = 0 ;kolom_atas<79;kolom_atas++)

printf("=");printf("\n=\t\t\t Program Pattern Matching\t\t\t =\n");for(int kolom_bawah = 0 ;kolom_bawah<79;kolom_bawah++)

printf("=");

printf("\n1.Draw\n");printf("2.View\n");printf("3.Load\n");

24

Page 25: Project Strukdat Finish

printf("4.Reset\n");printf("5.Matching\n");printf("6.About\n");printf("7.Exit\n");do{ printf("Choose: ");scanf("%d",&pilih);fflush(stdin);}while(pilih<1 || pilih >7);switch(pilih){case 1: if(!head)

{x=12;y=40;canvas[x][y]='*';system("cls");flag=1;

draw();instruction();while(x<24 || y<80){

if(flag==2) //jika flag = 2, berarti gambar sudah kembali ke titik awal dan akan break dari looping

{break;

}addpicture(&flag); // fungsi

addpicture dengan parameter flag, dimana flag merupakan nilai untuk menentukan apakah gambar sudah selesai

keliling++; //keliling bertambah 1 ketika menerima inputan user

}printf("\n");system("cls");draw();curr=head;printf("\n\nChain Codes: ");while(curr){

printf("%d",curr->Ai);curr=curr->next;

}calculate();

}else

printf("You've made a picture!!");break;

case 2: if(!head && !head2)printf("Draw a picture first!");

else{

if(!head2){

printf("Picture 1: \n");draw();

}else if(!head){

printf("Picture 2: \n");draw2();

}else

25

Page 26: Project Strukdat Finish

{printf("Picture 1: \n");draw();printf("Picture 2: \n");draw2();

}printf("+--------------------------------+\n");printf("| Pattern | 1 | 2 |\n");printf("|---------------------------------\n");printf("| Lebar | %-9d| %-9d|\n",lebar,lebar2);printf("| Tinggi | %-9d| %-9d|\

n",tinggi,tinggi2);printf("| Luas | %-9d| %-9d|\n",luas,luas2);printf("| Keliling | %-9d| %-9d|\

n",keliling,keliling2);printf("+--------------------------------+\n");}

getchar();break;

case 3: if(!head2){

load();draw2();curr2=head2;printf("Chain code: ");while(curr2){

printf("%d",curr2->Ai);curr2=curr2->next;

} printf("\nLebar=%d",lebar2);printf("\nTinggi=%d",tinggi2);printf("\nKeliling=%d",keliling2);printf("\nLuas=%d",luas2);

}else{

draw2();printf("Data already loaded!\n\n");curr2=head2;printf("Chain code: ");while(curr2){

printf("%d",curr2->Ai);curr2=curr2->next;

} printf("\nLebar=%d",lebar2);printf("\nTinggi=%d",tinggi2);printf("\nKeliling=%d",keliling2);printf("\nLuas=%d",luas2);

}getchar();break;

case 4: popAll();printf("\n\nReset Success!!");getchar();break;case 5: system("cls"); matching(); getchar(); break;case 6: about();getchar();break;}

}while(pilih!=7);getchar();

}

26