바람이 불때 프리킥 코드 06-03
# wind
wind_speed = 5 # m/s
#wind_speed = -5 # m/s
#wind_speed = -10 # m/s
wind_v = wind_speed*vec(1,0,0)
# Drag Force
ball.v_w = ball.v - wind_v
drag_wind = -0.5*rho*Cd*(pi*ball.radius**2)*mag(ball.v_w)**2*norm(ball.v_w)
# Sum of Forces
ball.f = grav + drag_wind
마그누스 효과
공에 회전 – 회전하는 방향으로 공이 휨 – 마그누스 힘, 마그누스 효과 – 물체주변의 공기 + 물체 회전 – 진공에서는 휘지 않음. – 물체와 기체분자와의 상호작용 – 기체분자가 축구공에 미치는 알짜힘 ->위쪽 방향으로의 힘.
바나나킥 시뮬레이션 08-01
Cm = 1 # 저항계수
w = 10*2*pi # 10 rev. per sec 초당 10회전
# Magnus Force
magnus = 0.5*rho*Cm*(pi*ball.radius**2)*ball.radius*w*mag(ball.v)*cross(vec(0,1,0),norm(ball.v))
# Sum of Forces
ball.f = grav + drag + magnus
GlowScript 2.9 VPython
# 지구 : 반지름 6,400,000m, 6,400km
Earth = sphere(pos = vector(0,0,0), radius = 6400000, texture = textures.earth)
# 달 : 지구와 거리 385,000,000m 385,000km, 반지름 1,737,000m 1,737km
Moon = sphere(pos = vector(385000e3,0,0), radius = 1737000, make_trail = True)
sf = 6 #scailing factor
Earth.radius = sf*Earth.radius
Moon.radius = sf*Moon.radius
# 중력상수, 만유인력상수, 뉴턴상수: 6.674×10-11 N m2/kg2
G = 6.67e-11
# 지구 질량
Earth.mass = 5.972e24
# 달 질량
Moon.mass = 7.347e22
Earth.v = vec(0,0,0)
Moon.v = vec(0,0,0)
# time
t = 0
dt = 60
# Simulation Loop
while True:
rate(1000)
# Forces
r = Earth.pos - Moon.pos
Moon.f = G * Earth.mass * Moon.mass / mag(r) ** 2 * norm(r)
Earth.f = -Moon.f
# Time Integration
Moon.v = Moon.v + Moon.f/Moon.mass*dt
Earth.v = Earth.v + Earth.f/Earth.mass*dt
Moon.pos = Moon.pos + Moon.v*dt
Earth.pos = Earth.pos + Earth.v*dt
t = t + dt
# Collision Check
if Earth.radius + Moon.radius > mag(r):
print("Collision!")
print(t/60/60/24, "days")
break
달의 공전
달의 공전속도 = 1,022km/s – Moon.v = vec(0, 1022, 0)
코드 05-01 – 만유인력에 의해 (서로 끌어당겨) 점점 위로 올라감 – 지구의 초기속도를 달의 초기속도 반대 방향으로 설정 – 지구의 초기속도 = 달의 속도 x 달의 질량 / 지구의 질량 Earth.v = -Moon.v * Moon.mass / Earth.mass -> 운동량 보존의 법칙 : 지구와 달을 하나의 시스템을 보았을때 운동량을 0으로 만드는 방법 (이렇게 하면 질량 중심의 위치가 변하지 않음)
속도 – 일정 시간동안 물체의 위치가 변한 정도 – 위치의 변화, 변위를 나타내는 물리량 – 벡터 형태로 표현 – Speed and Velocity – 속력과 속도 – 속력 speed = \frac {{\varDelta}s} {{\varDelta}t} = \frac{Distance}{Time} = \frac{50 km}{1 hour} : 스칼라 – 속도(Velocity) 는 방향이 있는 속력 : 벡터
dt = 0.01
while t < 4:
rate(1/dt)
ball.pos = ball.pos + ball.v*dt
t = t + dt
rate : 초당 몇번 이 구문을 실행하게 할것인가?
rate(1/dt) : 실시간, 시간간격을 dt로 잡았다면 1/dt 는 실시간, dt가 1초면 1초마다, 0.01초면 0.01초마다.
rate(100) : 초당 while 루프 안을 100 번 수행(화면을 변경)하겠다는 의미
제 2 법칙 가속도의 법칙
\color{blue} F = ma
힘 = 질량 X 가속도
힘이 클수록 더 많은 가속도
질량이 클수록 더 적은 가속도
힘이 변하지 않을때, 가속도는 일정 : 등가속도운동
하나의 물체에 여러힘이 작용할때는 벡터의 합으로 알짜 힘을 구함
가속도 (Acceleration) – 속도가 변하는 정도 : 일정 시간 동안 물체의 속도가 변한 정도
가속도 = 속도가 변한 정도 / 일정 시간 = {\frac {4 m/s} {2 s}} = 2 m/s2
가속도 예제 03-01
GlowScript 2.9 VPython
#creating ball
ball = sphere(radius = 0.2)
#Initial Setting
ball.pos = vec(-2,0,0) ## m
ball.v = vec(0,0,0) ## m/s
ball.a = vec(0.35,0,0) ## m/s**2, 가속도
t = 0 ## s
dt = 1 ## s
attach_arrow(ball, "v", shaftwidth=0.1, color=color.green)
attach_arrow(ball, "a", shaftwidth=0.05, color=color.red)
attach_trail(ball, type = 'points', pps = 5)
while t < 4:
rate(1/dt)
ball.v = ball.v + ball.a*dt
ball.pos = ball.pos + ball.v*dt #r1 ‐> r2
t = t + dt
attach_trail(ball, type = 'points', pps = 5)
- 객체의 자취를 그려주는 함수
- ball : 자취를 그릴 객체
- type : 자취의 type 설정
- pps : 점을 몇초마다 그릴 것인지
motion_graph = graph(title = 'position-time', xtitle = 't', ytitle = 'y')
- 그래프 생성 함수
- title : 그래프 이름 설정
- xtitle : x축 이름 설정
- ytitle : y축 이름 설정
g_bally = gcurve()
- 그래프의 데이터를 그리는 함수
g_bally.plot(pos(t, ball.pos.y))
- 그래프에 새 데이터를 추가해 그리는 함수
포물체의 움직임 예제 03-03
GlowScript 2.9 VPython
rList = list()
objList = list()
#Creating Objects
ground = box(pos = vec(0, -5, 0), size = vec(15, 0.01, 15))
for i in range(0, 100):
rList.append(vec(0, -4, 0))
for r in rList:
objList.append(sphere(pos = r, radius = 0.1, color = vec(random(), random(), random()), make_trail=True, retain = 30))
#Intitial Condition
vi = vec(0, 5.0, 0)
a = vec(0, -3, 0)
explosion = False
for obj in objList:
obj.v = vi
#time Setting
t = 0
dt = 0.01
#Simulation Loop
while t < 12:
rate(1/dt)
#Explosion
if t > 1 and explosion == False:
print("explosion!")
for obj in objList:
obj.v = obj.v + vec(random()-0.5, random()-0.5, random()-0.5)
explosion = True
#Velocity and Position Update
for obj in objList:
obj.v = obj.v + a*dt
obj.pos = obj.pos + obj.v*dt
#Coliision Handling
if obj.pos.y < ground.pos.y:
obj.pos.y = ground.pos.y
obj.v.y = -0.8 * obj.v.y
obj.color = vec(random(), random(), random())
t = t+dt
mag(r)
- 벡터 r의 크기(길이)를 계산해서 반환하는 함수
norm(r)
- 벡터 r의 단위 벡터를 계산해서 반환하는 함수
제 3 법칙 작용 반작용의 법칙
어떠한 물체에 힘이 작용하면 물체에 힘이 작용하는 동시에, 항상 크기가 같고 방향이 반대인 힘이 작용함