IKG3H2 Computer Graphics

advertisement
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
Download