IKG3H2 Computer Graphics Gnuplot for scientific computing DR. PUTU HARRY GUNAWAN
Info penting!
Keputusan, setelah UTS sampai akhir UAS, mata kuliah ini akan tetap mempelajari GNUPLOT dan C/C++. Bertujuan untuk memperdalam/ memfokuskan visualisasi sains dengan GNUPLOT dan review C/C++ dalam minimal pemodelan sederhana tanpa proses numerik.
Serta mengurangi proses mahasiswa dalam mempelajari Software lain yang terlalu banyak. Sehingga tidak memerlukan proses instalasi software dan proses belajar awal penggunaan Software.
Sampai UAS, proses belajar mahasiswa dalam bentuk kelompok (Max 3 orang).
UAS berupa presentasi final project dihadapan (Max tiga dosen) langsung dalam waktu max 20 menit.
Next
1. Solving Problems (Mid-Term Exam)
Soal A 1
Sebuah mobil bergerak melalui jalan yang menanjak dan menurun menyerupai sebuah grafik sinusoidal seperti pada gambar di bawah ini:
Soal A 1 Jika diketahui domain pengamatan Ω = [−200 : 1200] km, maka: a)
Tentukanlah fungsi f(x) = sin(?/?) seperti gambar diatas!
b)
Buatlah gambar seperti Figure 1 di atas dengan posisi dan jenis kendaraan bebas (anda bisa improve sendiri, dalam hal ini bisa menggunakan gambar mobil atau motor)! Gunakan syntax berikut untuk menampilkan gambar kedalam gnuplot:
plot "car.jpeg" binary filetype=jpg center=(250,225) with rgbimage notitle c)
Buatlah simulasi untuk pergerakan sebuah kendaraan yang melalui daerah yang telah didefinisikan! (Jika memungkinkan, gambar kendaraan diharapkan bisa menukik ke bawah atau ke atas jika sedang berada di turunan atau tanjakan).
Solusi A 1 bagian a
Fungsi jalannya adalah 𝜋𝑥 𝑓 𝑥 = 100 sin + 100 500
Solusi A 1 bagian c
Seperti biasa kita perlukan syntax basic untuk C/C++ #include <stdio.h> #include <math.h> int main() { //Write code Here return 0; }
Solusi A 1 bagian c
Selanjutnya, kita definisikan domain beserta fungsi jalan #include <stdio.h> #include <math.h>
Domain Ω = −200: 1200 , berarti kita memiliki panjang jalur L = 1200 − −200 = 1400
int main() { double Nx= 1400; double dx=1; double* x= new double[Nx+1]; double* y= new double[Nx+1];
Jika kita mendiskritkan domain sebesar dx=1 kita akan punya banyak titik sebanyak
for(int i=1; i<=Nx; i++){ x[i]=i*dx -200; y[i]=sin(3.14*x[i]/500)*100+100; }
return 0; }
𝑁𝑥 =
𝐿 1400 = = 1400 𝑑𝑥 1
Exercise
Plot the x and y functions!
Solusi A 1 bagian c
Untuk mensimulasikan benda bergerak, kita perlu definisikan loop while/for seperti pada slide kuliah sebelumnya.
#include <stdio.h> #include <math.h> int main() { . . . . . for(int i=1; i<=Nx; i++){ x[i]=i*dt -200; y[i]=sin(3.14*x[i]/500)*100+100; } int Nt=Nx; for(int waktu=1; waktu <=Nt; waktu++) { //Plot the figure } return 0; }
Untuk mebuat simulasi mobil bergerak per detik per titik diskrit, maka diperlukan step waktu untuk memvisualkan mobil. Dengan memilih 𝑁𝑡 = 𝑁𝑥
Solusi A 1 bagian c
Bagaimana cara plot mobil??
FILE* pipe = popen("gnuplot", "w"); if (pipe != NULL) { fprintf(pipe, "reset\n"); fprintf(pipe, "set xrange[-200:1200]\n"); fprintf(pipe, "set yrange[0:600]\n"); fprintf(pipe, "plot 'car.jpeg' binary filetype=jpg center=(%g,%g) with rgbimage notitle, '-' with lines lw 3 notitle\n",x[waktu],y[waktu] +50); for(int i=1; i<=Nx; i++){ Untuk menghasilkan gambar yang bergerak fprintf(pipe,"%g %g\n",x[i],y[i]); tentunya kita harus mengatur posisi tengah } fprintf(pipe,"end\n"); gambar sesuai dengan waktu jalan, fprintf(pipe, "pause 0.5\n"); dikarenakan step waktu = step spasial (lihat fflush(pipe); } warna kuning). (50 digunakan untuk else puts("Could not open the file\n"); mengatur ketinggian gambar). pclose(pipe); }
Supaya jalan tetap terlihat, Kurva y, harus tetap ditampilkan tiap detik waktu, maka tambahkan syntax setelahnya (lihat warna merah).
Hasil 1
Solusi A 1 bagian c
Bagaimana cara mobil bisa menukik naik turun sesuai dengan kondisi jalan?
Note: Untuk membuat mobil menukik kebawah atau keatas, kita perlu pengetahuan yakni arah kepala mobil harus sesuai dengan arah gradient dari kurva. Gradiennya 0
Solusi A 1 bagian c
Jadi untuk mentukan arah kepala mobil perlu gradient dari 𝑓 𝑥 yaitu 𝑑𝑓 𝑥 100 𝜋 𝜋𝑥 ′ =𝑓 𝑥 = cos 𝑑𝑥 500 500
Selanjutnya perlu perbaikan di bagian program
Solusi A 1 bagian c
Modifikasi tambahan variabel
#include <stdio.h> #include <math.h>
int main() { double Nx= 1400; double* x= new double[Nx+1]; double* y= new double[Nx+1]; double* Grady= new double[Nx+1]; for(int i=1; i<=Nx; i++){ x[i]=i*dt -200; y[i]=sin(3.14*x[i]/500)*100+100; Grady[i]=100*3.14*cos(3.14*x[i]/500)/500; } . . . . return 0; }
Tambahkan variabe baru yakni Grady sebagai fungsi untuk rotasi kepala mobil
Solusi A 1 bagian c
Modifikasi bagian Plot
fprintf(pipe, "plot 'car.jpeg' binary filetype=jpg center=(%g,%g) rotation=%g with rgbimage notitle, '-' with lines lw 3 notitle\n",x[waktu],y[waktu] +50, Grady[waktu]);
Modifikasi di bagian plot sangatlah sederhana, hanya menambahkan syntax rotation dengan besarannya senilai dengan variable Grady (lihat warna merah).
Hasil 2
Exercise
Buatlah laporan dengan detail (Berkelompok) untuk memecahkan kasus yang ada di soal UTS Tipe A soal 3
Buat laporan sedetail mungkin jelaskan dengan kata2 sendiri.
Dikumpul laporan hardcopy, serta Softcopy laporan dan Program lengkap dengan hasilnya yaitu videonya saja yang diupload di Gdrive.
Thank you