[PYTHON] 파이썬 예제코드입니다 - vpython(1) 1자유도 스프링-질량계 애니메이션, 1DOF mass-spring system
혹시 비슷한 분야를 공부하시는 분들은 허접한 코드지만 참고해서 봐주세요~
코드는 대부분 여러 고수님들의 코드를 참고해 작성했습니다 :-)
위의 조건을 바탕으로
1자유도계 스프링-질량계(1DOF Spring-Mass System)를 애니메이션화 하는 코드를 작성하시오
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# code from https://www.youtube.com/watch?v=c3tX_qReGIM
from visual import * #----------------------------------------------------------------- # 그래픽 그려주는 코드 #------------------------------------------------------------------ g = 9.81 # 중력가속도 9.81 m/s^2 # 화면 객체를 생성합니다. backgroun 색과 카메라 center 포인트를 설정한다 scene = display(background = (0.36, 0.47, 0.23), center = vector(0, -0.7, -0.5)) # 천장의 물체를 생성합니다. 재질은 wood이고 색깔은 orange입니다. ceiling = box(length = 1, width = 1, height = 0.01, material = materials.wood, color = color.orange) # ball을 생성합니다. # 반지름은 0.1m # 초기 위치는 y방향으로 -0.5m입니다. (vpython에서는 y방향이 밑방향입니다) # 질량은 0.5kg # 초기속도는 0입니다 ball = sphere(radius = 0.1, color = color.green, opacity=0.8) ball.pos = vector(0, -0.5, 0) ball.m = 0.5 ball.v = vector(0,0,0) # 스프링을 생성합니다. 코일 수는 15번, radius(반지름)와 thickness(두께)를 설정합니다 # 길이는 천장에서 ball까지로 설정합니다 spring = helix(coils = 15, radius = 0.05, thickness = 0.01) spring.pos = ceiling.pos spring.axis = ball.pos - spring.pos # spring.L에는 초기 ball의 위치값이 들어갑니다. (여기서는 0.5m로 고정됩니다) # 스프링상수는 10 N/m입니다 spring.L = abs(ball.pos) spring.k = 10.0 # 텍스트를 표시하는 라벨객체를 생성합니다 label1 = label() label2 = label() label3 = label() # 스프링의 힘을 리턴하는 함수 def spring_F(spring): return -spring.k * (spring.length - spring.L) * spring.axis.norm() #------------------------------------------------------------------ # 애니메이션 코드 #------------------------------------------------------------------ dt = 0.01 t = 0 while True: rate(100) # [Hz] 만큼 루프를 지연시킵니다 F = spring_F(spring) # 힘을 구해서 F 변수에 저장 ball.a = vector(0, -g, 0) + F / ball.m # 가속도 ball.v += ball.a * dt # 속도 ball.pos += ball.v * dt # 위치 spring.axis = ball.pos - spring.pos # 스프링이 공을 따라가게 하기 위한 코드 t += dt # 위치, 속도, 가속도를 표시합니다 label1.pos = ceiling.pos + vector(0.5,0.2,0) label1.text = ('position is : %1.2f' % ball.pos.y) label2.pos = ceiling.pos + vector(0.5,0.05,0) label2.text = ('velocity is : %1.2f' % ball.v.y) label3.pos = ceiling.pos + vector(0.5,-0.10,0) label3.text = ('acc is : %1.2f' % ball.a.y) #if ball.v.y >= 0 and ball.v.y + ball.a.y * dt <= 0: # print (t) Colored by Color Scripter |
vpython은 3D Visualization을 쉽게 할 수 있는 패키지입니다. 이를 활용하면 여러가지 공학적인 움직임에 대해 쉽게 애니메이션화 할 수 있습니다. 최근에 알았는데 매우 간편하게 사용할 수 있어 좋드라구요 :-)
3D 그래픽툴이므로 마우스를 사용해 각도를 조정할 수 있고 원하는 방향에서 볼 수 있습니다.
마우스 휠 클릭 상태로 마우스 이동 ==> 줌인, 줌아웃
마우스 우클릭 상태로 마우스 이동 ==> 각도 변경
설치는 공식홈페이지에서 다운받으시면 됩니다.
http://vpython.org/contents/download_windows.html
윈도우, 리눅스, 맥을 다 지원합니다. 하지만 python 3.x 버전은 아쉽게도 공식적으로 지원하지는 않는것 같네요. 2.x 버전에서 정상작동하는 것 확인했습니다 (2017.6 기준)
좋은 참고자료 사이트 추천드립니다. 중국사이트들이 많네요. 저도 중국어는 몰라서 한/중 구글번역 돌리고 필요한 코드들만 따와서 사용하고 있습니다 :-)
vphysics라는 중국 교육사이트인 것 같습니다. 다양한 예제들이 많아서 제일 많이 참고한 좋은 사이트입니다 :-)
http://tcjd71.wixsite.com/vpython/blank-c1iws
TW쭌님의 블로그입니다. vpython 관련 참고 사이트들을 많이 링크해주셔서 많은 도움이 되었습니다!
http://blog.naver.com/PostView.nhn?blogId=junix&logNo=220498150208&beginTime=0&jumpingVid=&from=section&redirect=Log&widgetTypeCall=true
기타 유튜브 영상들입니다. 이 또한 좋은 참고자료가 되었습니다
https://www.youtube.com/watch?v=c3tX_qReGIM
https://www.youtube.com/watch?v=9Hf6kfU9KCg
https://www.youtube.com/watch?v=9n8XCwCmBho
https://youtu.be/H8CzQtx9vds
https://youtu.be/UoN70GjnBTI
[출처] https://m.blog.naver.com/gyurse/221032819290
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.