Dalam tulisan kali ini saya sedikit berbagi pengalaman dalam menggunakan Microsoft Excel. Kebetulan kemarin saya mencoba membuat sebuah animasi mengenai bidang miring dengan menggunakan VBA ala Microsoft Excel. Masalahnya adalah rumusan saya tentang posisi kotak pada bidang miring itu sudah benar 100 persen. Yang bikin heran kok hasil penggambaran di Microsoft Excel tidak sesuai yang saya harapkan?
Gambar 1. Geometri Bidang Miring |
Pada gambar 1, dengan mengingat bahwa koordinat monitor menggunakan titik asal pada TOP-LEFT, maka dapat diberlakukan persamaan:
\begin{eqnarray}
x_1 = x_2 - w \cdot \sin(\alpha) \\
y_1 = y_2 + w \cdot \cos(\alpha)
\end{eqnarray}
yang mengakibatkan
\begin{eqnarray}
x_2 = x_1 + w \cdot \sin (\alpha) \\
y_2 = y_1 - w \cdot \cos(\alpha)
\end{eqnarray}
Nah, rumusan ini berhasil saya terapkan dengan sempurna di JavaFX. Tapi entah kenapa ketika saya ganti ke VBA dari Microsoft Excel, semuanya kacau dan tidak sesuai harapan. Yang saya heran di Microsoft Excel, kok menghitung fungsi matematika yang berkaitan dengan trigonometri, dia menggunakan sudut radian. Ketika dia menentukan rotasi suatu objek, dia menggunakan sudut derajat. Mungkin saja ini penyebabnya atau satu dan lain hal, saya juga g tau.
Berikut ini adalah cuplikan video hasil implementasi dari rumus di atas di JavaFX:
Sementara source code untuk implementasi tersebut dapat anda lihat di github.
Adapun video dari keanehan Microsoft Excel yang dimaksud adalah:
di mana contoh implementasinya adalah
Sub TestAnimasi() total_iterasi = 0 Dim shape As shape namaBenda = "Kotak" Set shape = Sheet1.shapes(namaBenda) Dim segitiga As shape Set segitiga = Sheet1.shapes("Bidang Miring") lokasiSegitigaX = segitiga.Left lokasiSegitigaY = segitiga.Top panjang = segitiga.Width lebar = segitiga.Height ' Hitung kemiringan bidang Dim sudutDerajat As Double sudut = Math.Atn(lebar / panjang) sudutDerajat = sudut / WorksheetFunction.Pi * 180 shape.Rotation = sudutDerajat 'Hitung default posisi defaultX = segitiga.Left + shape.Height * Sin(sudut) defaultY = segitiga.Top - shape.Height * Cos(sudut) 'Letakkan kotak pada bagian awal dari bidang miring shape.Left = defaultX shape.Top = defaultY n = Sheet1.Cells(12, 13) Sheet1.Cells(22, 16) = sudutDerajat panjangLintasan = Math.Sqr(lebar * lebar + panjang * panjang) spasiLintasan = panjangLintasan / n lintasanAwal = 0 Do DoEvents shape.Left = shape.Left + spasiLintasan * Cos(sudut) shape.Top = shape.Top + spasiLintasan * Sin(sudut) total_iterasi = total_iterasi + 1 lintasanAwal = lintasanAwal + spasiLintasan timeout (0.2) Loop Until total_iterasi = n - 1 End Sub Sub timeout(waktu As Double) StartTime = Timer Do DoEvents Loop Until (Timer - StartTime) >= waktu End Sub