Codingan 1
#!/usr/bin/env python3
# -- coding: utf-8 --
"""
Created on Fri Oct 29 07:20:45 2021
@author: Rizal Kurniadi
"""
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import NewTools
import math
import random
import csv
def readData(scale, rot, Xo, Yo):
cosa = math.cos(rot / 180 * math.pi)
sina = math.sin(rot / 180 * math.pi)
Yo = Yo + scale * 66
XB = []
YB = []
DX = 40 - Xo
DY = -255 - Yo
with open('GambarCar.csv', 'r') as file: # Utama
reader = csv.reader(file)
Data = []
P = []
count = 0
for row in reader:
count = count + 1
x = scale * (int(row[0]) - (scale - 1) * 40 - DX)
y = - (scale * int(row[1]) - (scale - 1) * 255) - DY
X = (x - Xo) * cosa - (y - Yo) * sina + Xo
Y = (x - Xo) * sina + (y - Yo) * cosa + Yo
if count <= 90:
P.append([X, Y])
if count == 90:
Data.append(P)
P = []
if count > 90:
if count <= 183:
P.append([X, Y])
if count == 183:
Data.append(P)
P = []
if count > 183:
if count <= 204:
P.append([X, Y])
if count == 204:
Data.append(P)
P = []
if count > 204:
if count <= 212:
P.append([X, Y])
if count == 212:
Data.append(P)
P = []
if count > 212:
if count <= 216:
P.append([X, Y])
if count == 216:
Data.append(P)
P = []
if count > 216:
if count <= 220
P.append([X,Y])
if count==220:
Data.append(P)
P = []
if count>220:
if count<=322:
P.append([X,Y])
if count==322:
Data.append(P)
P = []
if count>322:
if count<=373:
P.append([X,Y])
if count==373:
Data.append(P)
P = []
if count>373:
if count<=389:
P.append([X,Y])
if count==389:
Data.append(P)
P = []
if count>389:
if count<=399:
P.append([X,Y])
if count==399:
Data.append(P)
P = []
if count>399:
if count<=432:
P.append([X,Y])
if count==432:
Data.append(P)
P = []
x = scale*229-(scale-1)*40-DX
y = (scale*223-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
x = scale*350-(scale-1)*40-DX
y = (scale*155-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
x = scale*350-(scale-1)*40-DX
y = (scale*140-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
for i in range(0,13):
x = scale*(586+i*8)-(scale-1)*40-DX
y = (scale*205-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
x = scale*328-(scale-1)*40-DX
y = (scale*116-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
x = scale*206-(scale-1)*40-DX
y = (scale*116-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
x = scale*136-(scale-1)*40-DX
y = (scale*251-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
x = scale*720-(scale-1)*40-DX
y = (scale*251-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
x = scale*529-(scale-1)*40-DX
y = (scale*189-(scale-1)*255)-DY
X = (x-Xo)*cosa-(y-Yo)*sina+Xo
Y = (x-Xo)*sina+(y-Yo)*cosa+Yo
XB.append(X)
YB.append(Y)
Data.append(XB)
Data.append(YB)
return Data
def Mobil(ax,sdt,Skala,Data,rot):
Utama = Data[0]
SpakDep = Data[1]
BayDep = Data[2]
Wdw1 = Data[3]
Wdw2 = Data[4]
Wdw3 = Data[5]
SpakBlk = Data[6]
BayBlk = Data[7]
as1 = Data[8]
atap = Data[9]
as2 = Data[10]
yb = Data[12]
ax.add_patch(Polygon(Utama, closed=True, fill=True, color='royalblue', lw=2))
ax.add_patch(Polygon(as1, closed=True, fill=True, color='k', lw=2))
Balok(ax, x=xb[0], y=yb[0], Lebar=Skala*301, Tinggi=Skala*2, sudut=sdt, warna='darkblue')
NewTools.
Balok(ax, x=xb[1], y=yb[1], Lebar=Skala*1, Tinggi=Skala*15, sudut=sdt, warna='darkblue')
NewTools.lingkaran(ax, x=0.8*xb[1], y=0.8*yb[1], R=Skala*2, warna='darkblue')
NewTools.lingkaran(ax, x=0.2*xb[1], y=0.2*yb[2], R=Skala*2, warna='darkblue')
for i in range(0,13):
NewTools.
Balok(ax, x=xb[3+i], y=yb[3+i], Lebar=Skala*2, Tinggi=Skala*63, sudut=sdt, warna='darkblue')
ax.add_patch(Polygon(wdw1, closed=True, fill=True, color='linen', lw=2))
ax.add_patch(Polygon(wdw2, closed=True, fill=True, color='linen', lw=2))
ax.add_patch(Polygon(wdw3, closed=True, fill=True, color='linen', lw=2))
NewTools.
Balok(ax, x=xb[16], y=yb[16], Lebar=Skala*14, Tinggi=Skala*61, sudut=sdt,
warna='saddlebrown')
Balok(ax, x=xb[17], y=yb[17], Lebar=Skala*14, Tinggi=Skala*61, sudut=sdt,
warna='saddlebrown')
ax.add_patch(Polygon(atap, closed=True, fill=True, color='darkslateblue', lw=2))
ax.add_patch(Polygon(SpakDep, closed=True, fill=True, color='cornflowerblue', lw=2))
ax.add_patch(Polygon(BayBlk, closed=True, fill=True, color='midnightblue', lw=2))
ax.add_patch(Polygon(SpakBlk, closed=True, fill=True, color='cornflowerblue', lw=2))
NewTools.Roda(ax, xc=xb[18], yc=yb[18], R=Skala*70, warna='k', NSpot=10, srot=rot)
NewTools.Roda(ax, xc=xb[19], yc=yb[19], R=Skala*70, warna='k', NSpot=10, srot=0)
NewTools.Roda(ax, xc=xb[20], yc=yb[20], R=Skala*70, warna='k', NSpot=10, srot=0)
def PhysProb(S, S0, idx, angle, Scal, DATA):
ax = plt.subplot()
ax.set(xlim=(0, 200), ylim=(0, 250))
ax.set_aspect(1)
plt.axis('off')
NewTools.Balok(ax, x=0, y=100, Lebar=200, Tinggi=200, sudut=0, warna='k')
NewTools.Balok(ax, x=2, y=102, Lebar=97.5, Tinggi=146, sudut=0, warna='w')
NewTools.Balok(ax, x=102, y=102, Lebar=95.5, Tinggi=146, sudut=0, warna='w')
NewTools.Teks(ax, x=0, y=236, s='Jarak vs Waktu', fs=11, warna='brown')
NewTools.Teks(ax, x=100, y=236, s='Kelajuan vs Waktu', fs=11, warna='brown')
sdt = (S / (3 * 7 * 1.8)) / math.pi * 180
Mobil(ax, angle, Scal, DATA, sdt)
NewTools.Balok(ax, x=0, y=0, Lebar=200, Tinggi=20, sudut=0, warna='darkslategrey')
SX = S - S0
if SX > 100:
idx = idx + 1
S0 = S
DX = idx * 100
NewTools.lingkaran(ax, x0=50+DX-S, y0=-40, R=50, warna='w')
NewTools.lingkaran(ax, x0=150+DX-S, y0=-40, R=50, warna='w')
NewTools.lingkaran(ax, x0=250+DX-S, y0=-40, R=50, warna='w')
NewTools.lingkaran(ax, x0=350+DX-S, y0=-40, R=50, warna='w')
NewTools.Balok(ax, x=0+DX-S, y=20, Lebar=5, Tinggi=25, sudut=0, warna='saddlebrown')
NewTools.Balok(ax, x=0+DX-S, y=38, Lebar=100, Tinggi=2, sudut=0, warna='saddlebrown')
NewTools.Balok(ax, x=100+DX-S, y=20, Lebar=5, Tinggi=25, sudut=0, warna='saddlebrown')
NewTools.Balok(ax, x=100+DX-S, y=38, Lebar=100, Tinggi=2, sudut=0, warna='saddlebrown')
NewTools.Balok(ax, x=200+DX-S, y=20, Lebar=5, Tinggi=25, sudut=0, warna='saddlebrown')
NewTools.Balok(ax, x=200+DX-S, y=38, Lebar=100, Tinggi=2, sudut=0, warna='saddlebrown')
NewTools.Balok(ax, x=300+DX-S, y=20, Lebar=5, Tinggi=25, sudut=0, warna='saddlebrown')
NewTools.Balok(ax, x=300+DX-S, y=38, Lebar=100, Tinggi=2, sudut=0, warna='saddlebrown')
return idx, S0
fig = plt.figure()
scal = 0.18
idx = 0
S0 = 0
k=0
t=0
Vt = 0
times = []
St = []
time2 = []
V_t = []
times.append(t)
St.append(s/(2500*125+100))
time2.append(t+100)
V_t.append(Vt/50*80+100)
while Vt <= 50:
Data = readData(scale=scal, rot=0, Xo=25, Yo=20)
idx, s0 = PhysProb(s, S0, idx, 0, scal, Data)
plt.plot(times, St)
plt.plot(time2, V_t)
s = 0.5 * 1 * t ** 2
Vt = 1 * t
t = t + 0.25
times.append(t)
St.append(s/(2500*125+100))
time2.append(t+100)
V_t.append(Vt/50*80+100)
plt.savefig(str(100+k)+'.png', dpi=96)
k=k+1
plt.clf()
print([Vt,s,t])
t = t - 0.5
tm = t
stm = 0.5*1*tm**2
s = stm
Vtm = 1*tm
while Vt > 0:
Data = readData(scale=scal, rot=0, Xo=25, Yo=20)
Idx, so = PhysProb(s, so, Idx, 0, scal, Data)
plt.plot(times, St)
plt.plot(time2, V_t)
s = stm + 0.5*(-1)(t2 - tm2) + Vtm(t - tm) + (-1)tm(t - tm)
Vt = Vtm + (-1)*(t - tm)
t = t + 0.25
times.append(t)
St.append(s/2500*125+100)
time2.append(t+100)
V_t.append(Vt/50*80+100)
plt.savefig(str(100+k)+'.png', dpi=96)
k=k+1
plt.clf()
print([Vt, s, t])
for j in range(0, 80):
Data = readData(scale=scal, rot=0, Xo=25, Yo=20)
Idx, so = PhysProb(s, so, Idx, 0, scal, Data)
plt.plot(times, St)
plt.plot(time2, V_t)
plt.savefig(str(100+k)+'.png', dpi=96)
k=k+1
plt.clf()
print(j)
NewTools.SimpanAnimasi2('Animasi1')
Output
Codingan 2
import matplotlib.pyplot as plt
import math
import os
import NewTools
# Buat folder penyimpanan frame
if not os.path.exists('frames'):
os.makedirs('frames')
def PhysProb(x1, x2, x3):
fig = plt.figure()
ax = plt.subplot()
ax.set(xlim=(-40, 40), ylim=(-40, 5))
ax.set_aspect(1)
plt.axis('off')
# Objek dan gaya
NewTools.Balok(ax, -40+x1, -40+2, 8, 6, sudut=0, warna='black')
NewTools.Panah(ax, -40+8+x1, -40+2+3, L=5, alfa=0, warna='green', scale=1)
NewTools.Teks(ax, -40+8+2+x1, -40+2+3+2, '5 N', fs=10, warna='k')
NewTools.Balok(ax, -40, -40, 80, 2, sudut=0, warna='darkolivegreen')
NewTools.Balok(ax, -40+x2, -40+15+2, 8, 6, sudut=0, warna='black')
NewTools.Panah(ax, -40+8+x2, -40+15+2+3, L=10, alfa=0, warna='green', scale=1)
NewTools.Teks(ax, -40+8+2+x2, -40+15+2+3+2, '10 N', fs=10, warna='k')
NewTools.Balok(ax, -40, -40+15, 80, 2, sudut=0, warna='darkolivegreen')
NewTools.Balok(ax, -40+x3, -40+2*15+2, 8, 6, sudut=0, warna='black')
NewTools.Panah(ax, -40+8+x3, -40+2*15+2+3, L=15, alfa=0, warna='green', scale=1)
NewTools.Teks(ax, -40+8+2+x3, -40+2*15+2+3+2, '15 N', fs=10, warna='k')
NewTools.Balok(ax, -40, -40+2*15, 80, 2, sudut=0, warna='darkolivegreen')
return fig
x1 = x2 = x3 = 0
a=2
t=0
k=0
while x1 <= 80:
fig = PhysProb(x1, x2, x3)
t += 0.01
x1 = 0.5 * a * t**2
x2 = 0.5 * 2 * a * t**2
x3 = 0.5 * 3 * a * t**2
print(x1)
fig.savefig(f'frames/frame_{100+k:03d}.png', dpi=96) # Format nama file dengan padding
3 digit
plt.close(fig)
k += 1
# Simpan animasi dan hapus frame individual
NewTools.SimpanAnimasi2('animasi.gif', format='gif') # Atau ubah ke mp4 kalau mau
# Hapus folder frames beserta isinya
import shutil
shutil.rmtree('frames')
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
import imageio
import os
import glob
def Balok(ax, x, y, panjang, tinggi, sudut=0, warna='blue'):
"""Menggambar balok di koordinat (x,y) dengan panjang dan tinggi tertentu"""
rect = patches.Rectangle((x, y), panjang, tinggi, angle=sudut,
linewidth=1, edgecolor='black', facecolor=warna)
ax.add_patch(rect)
def Panah(ax, x, y, L=10, alfa=0, warna='red', scale=1):
"""Menggambar panah gaya di koordinat (x,y) dengan panjang L dan sudut alfa"""
dx = L * np.cos(np.radians(alfa)) * scale
dy = L * np.sin(np.radians(alfa)) * scale
ax.arrow(x, y, dx, dy,
head_width=2*scale, head_length=2*scale,
fc=warna, ec=warna, linewidth=1.5*scale)
def Teks(ax, x, y, teks, fs=10, warna='k'):
"""Menambahkan teks di koordinat (x,y)"""
ax.text(x, y, teks, fontsize=fs, color=warna,
verticalalignment='center', horizontalalignment='center')
def SimpanAnimasi2(nama_file, format='gif', fps=10):
"""Menyimpan animasi dari frame-frame yang tersimpan di folder frames"""
try:
# Mengambil semua file frame secara berurutan
file_list = sorted(glob.glob('frames/frame_*.png'))
if not file_list:
raise ValueError("Tidak ada frame yang ditemukan di folder 'frames'")
frames = [imageio.imread(file_name) for file_name in file_list]
if format.lower() == 'gif':
imageio.mimsave(nama_file, frames, format='GIF', fps=fps)
elif format.lower() == 'mp4':
imageio.mimsave(nama_file, frames, format='MP4', fps=fps, quality=8)
else:
raise ValueError("Format harus 'gif' atau 'mp4'")
print(f"Animasi berhasil disimpan sebagai {nama_file}")
except Exception as e:
print(f"Error saat menyimpan animasi: {str(e)}")
output