project strukdat finish
TRANSCRIPT
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
Daftar Isi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Kata Pengantar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Isi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
Penutup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Daftar Pustaka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
Lampiran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
KATA PENGANTAR
2
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
}}
}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
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
}
//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
{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
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
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
{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