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.
makasih bang...sangat bermanfaat
ReplyDelete