Monday, October 6, 2014

MEMBUAT SKALA LOGARITMIK



Sekarang kita akan belajar untuk membuat skala logaritmik. Nah, sebenarnya untuk pembuatan program, khususnya yang skala logaritmik ini, akan lebih baik jika program ini dapat digunakan universal, artinya program menghasilkan yang benar berapapun data yang kita masukkan (dalam hal ini mindata dan maxdata). Sayangnya, program yang saya ajarkan pas praktikum shift selasa jam 12 beberapa minggu lalu tidak begitu (yang ada break nya itu loh, yang ada variable jint dsb), ada beberapa kecacatan, maklum lah waktu itu ngebuatnya pas masih diosjur, serem-serem asik gitu pas praktikum haha, terus juga masih remah-remah kan yang penting jadi aja. Kecacatannya sbb:

- logika pembuatan tick mark skala major yang tidak memperhitungkan jika mincycle kita bernilai minus, inti terjadi jika data kita ada yang dibawah 1. Contoh nilai log 0,01 adalah -2. posx=posxa+(i*skalax) kalau i nya bernilai minus kan dia ngegambar tickmarknya di belakang posxa terus muncul pertanyaan, kenapa i nya minus? Ya iya lah, kita soalnya mau makai i nya sebagai pangkat untuk sebagai nilai pada tick mark. Jadi 10^i

- logika pembuatan tick mark skala minor, pembuatan didasari oleh persamaan jarak dari nilai log 1 ke log 2 dengan log 10 ke 20, jadi pembuatan skala minor dilakukan per cycle. Harusnya pembuatan skala minor menurut saya lebih baik jika memang sesuai dengan nilainya misalnya tick mark di log 30 ya perhitungannya memang dari log 30. Kalo yang program kemaren kan perhitungannya dari log 3.
Yaudah yang bakal aku buat dibawah ini insya Allah udah versi universalnya. Jadi berapapun kamu masukin mindata dan maxdatanya, hasilnya tetap benar. Tapi tetap ingat, masing-masing orang punya logikanya tersendiri, jadi kalo kalian punya jalan pikir kalian sendiri jauh lebih baik. Terus yang diajarin kemaren nggak sepenuhnya salah kok sebenernya. Soalnya yang penting kan programnya menyelesaikan masalah (dalam hal ini mindata 1,4 dan max data 80) dengan baik.

Oke udah bacotan nya. Kita mulai aja ya. Penjelasan dikit dulu, jadi sebenarnya untuk membuat skala logaritmik ini kita mengkonversi data yang kita punya menjadi nilai logaritmik dari data kita. Dan sebenarnya kita mengkonversinya menjadi skala linear. Lihat gambar
Gitu sih
Oke kita mulai ya
1. yang pertama jangan lupa buat project terus atur linker settingnya. Lalu buat header :
#include <iostream>
#include <graphics.h>
#include <math.h>

2. buat lah window yang berukuran 600 x 600 px
3. deklarasikan dalam tipe float variabel :
posisiXawal = 100, posisiYawal = 100, lebar= 400
4. deklarasikan mindata = 1,4 maxdata = 80 dalam tipe float
5. nah lalu tentukan harus menentukan jumlah cycle kita, gunanya untuk skala dan juga jumlah perualangan yang kita lakukan nanti. Namun sebelumnya kita tentukan dulu :
Mincycle = log10(mindata) lalu dibulatin kebawah
Maxcycle = log10(maxdata) lalu bulatin keatas
Taukan perintah bulatin kebawah maupun keatas? Tau lah ya
Lalu jumlahcycle = maxcycle-mincycle
7. skala penggambaran kita adalah
Skala= lebar/cycle yang mana sama saja dengan linear kemaren kan lebar/maxcycle-mincycle
8. nah sekarang kan kita ingin membuat tickmark skala majornya yang 1,10,100. Nah jumlah tick marknya tu cycle + 1. Jumlah cycle +1 ini bisa kita capai dengan membuat perulangan dari i= mincycle sampai i=maxcycle. Coba itung sendiri deh kalo nggak percaya.
For(i=mincycle;i<=maxcycle;i++)
 - nah didalam for nya ada beberapa hal yang mesti kita buat, mirip dengan skala linear yaitu variabel yang menyimpan nilai pada tickmarknya (untuk dijadikan label) anggap variabelnya bernama Xint. Nah kita manfaatkan nilai perulangannya (i) untuk memperoleh nilai yang kita harapkan (1,10,100, dst)
Xint = 10i yang dapat ditulis diprogram kita pow(10,i)

- Kemudian buatlah variabel yang memuat nilai pixel untuk pemosisian tickmarknya
posx=posxa+(i*skalax)+(-mincycle*skalax)
lah kenapa nggak posxa + (i*skalax) aja?liat lagi noh penjelasan yang diatas ni saya lampirkan buktinya aja
- buat lah garis tickmark marknya dari titik (posx, posya-5) ke titik (posx,posya+5)
- masih di dalam for yang tadi, kita mesti mengeluarkan angka 1,10,100 diposisi tickmarknya masing-masing. Jadi daripada kita membuat pengondisian banyak-banyak karena digit yang diambil bakal berbeda2, maka kita buat aja pengondisian yang memanfaatkan nilai i untuk jumlah digit yang akan diambil.
Char r [10];
        if(xint>=1)
        gcvt(xint,i+1,r);

        else
        gcvt(xint,-i,r);
jadi kalo dia ,lebih besar dari 1 (1,10,100, dst) maka digit yang diambil i+1
kalau dia kurang dari 1 (0.1,0.01,dst) maka jumlah digit yang diambil adalah sebesar –i (nilai i nya soalnya minus jadi mesti di plus kan)

- keluarin deh teks nya
outtextxy(posx-3,posya-20,r);

10. masih dalam for yang tadi, kita harus membuat perulangannya kembali untuk membuat skala minornya. Skala minornya ada 8 kan sebenarnya, tapi karena aku sok rajin jadi buatnya 10 aja, jadi dia nimpa skala majornya. Nggak ngaruh sih, karena bikin garisnya lebih kecil dari skala majornya. Jadi buatlah perulangan dari j=1 sampai 10, didalam perulangan itu, kita buat lagi perulangan dari mincycle sampai <maxcycle. Buat apa? Untuk membatasi pembuatan skala minornya. Kan jumlah cyclenya ada 2, maxcyclenya 2, mincyclenya 0.jadi ada 2 cycle. Perulangannya jadi dari 0;1. ada 2 kan? Jadi kita nggak perlu pakai break break an.

        for(int j=1; j<=10;j++)
        {
            for(int k=mincycle; k<maxcycle; k++)
            {
                float jint=log10(j*pow(10,k));
/* jadi pas k=0, maka j (yang dari 1-10) akan dikali 1 hasilnya 1,2,3,4 dst) k=1, maka j dikali 10 (hasilnya jadinya 10,20,30,40,50, dst)*/
float posj= posxa+(jint*skalax)+((0-mincycle)*skalax); //posisi skala minornya, logikanya sama dengan yang buat skala majornya

                line(posj,posya-5,posj,posya);//buat garis deh
            }
        }
Dah sebenarnya udah beres. Coba aja bikin maxdata dan mindatanya sesuka kalian, insya Allah nggak ada masalah.

1 comment: