기타/What I Learned

[TIL] 파이썬으로 익히는 STEAM 코딩 (21.11.24)

가죽방패 2021. 11. 24. 11:52

※ 포물선 운동 궤적 그리기

- 물체의 초기 속도를 v라고 하고 각도를 # 이라고 할때 x축 방향 ux = v * cox#

y축 방향 uy = v * sin# 로 계산할 수 있다. 시간이 지날수록 속도는 변하며 x 축은 속도가 변하지 않은

상태로 동일한 속도가 유지되고 y축 방향은 중력의 영향으로 인해 y 축 속도가 vy = v * sin# - g * t가 된다.

 

이러한 속도 변화의 특성을 이용해 터틀 스크린에서 포물선 운동 궤적을 그려본다.

 

import turtle as t
import math

tm = 0.3				# 시간 간격
ux = 0					# x 속도
uy = 0					# y 속도
dx = 0					# x 이동 거리
dy = 0					# y 이동 거리
g = 9.8					# 중력 가속도
velo = 0				# 속도
ang = 0					# 각도

def draw_pos(x, y):
    velo = t.numinput("입력", "속도 : ", 50, 10, 100)				# 터틀 스크린에서 속도를 입력받아 velo에 저장
    ang = math.radians(t.numinput("입력", "각도 : ", 45, 0, 360))	# 터틀 스크린에서 각도를 입력받아 ang에 저장
    
    t.clearstamps()
    t.hideturtle()
    t.setpos(x, y)
    t.showturtle()
    t.stamp()
    
    hl = -(t.window_height() / 2)				# 터틀 스크린 하단의 y축 좌표를 hl에 저장
    
    ux = velo * math.cos(ang)
    uy = velo * math.sin(ang)
    
    while True:
        uy = uy + (-1 * g) * tm
        dy = t.ycor() + (uy * tm) - (g * tm**2) / 2
        dx = t.xcor() + (ux * tm)
        if dy > hl:				# 만약 터틀의 위치가 스크린의 하단. 즉, hl보다 높은경우 행동을 지속함
            t.goto(dx, dy)
            t.stamp()
        else:					# 스크린의 하단으로 나갈경우 중단
            break
        
t.setup(600, 600)
t.shape("circle")
t.shapesize(0.3, 0.3, 0)
t.penup()
s = t.Screen()
s.onscreenclick(draw_pos)
s.listen()
t.mainloop()