[go: up one dir, main page]

0% found this document useful (0 votes)
17 views11 pages

Codingan Fisika

The document contains Python code for visualizing physical problems using matplotlib, including functions for reading data from a CSV file, drawing shapes, and simulating motion. It defines a series of functions to create graphical representations of vehicles and their movements based on physics principles. The code also includes the generation of frames for an animation and saves the output as images.

Uploaded by

FATURRAHMAN 98
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
17 views11 pages

Codingan Fisika

The document contains Python code for visualizing physical problems using matplotlib, including functions for reading data from a CSV file, drawing shapes, and simulating motion. It defines a series of functions to create graphical representations of vehicles and their movements based on physics principles. The code also includes the generation of frames for an animation and saves the output as images.

Uploaded by

FATURRAHMAN 98
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 11

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

You might also like