[PYTHON] 파이썬 예제코드입니다 -
vpython(5) 3자유도 스프링-질량계 애니메이션, 3DOF mass-spring system
제가 프로그래밍을 공부하기 위해 작성한 코드입니다
혹시 비슷한 분야를 공부하시는 분들은 허접한 코드지만 참고해서 봐주세요~
코드는 대부분 여러 고수님들의 코드를 참고해 작성했습니다 :-)
위의 조건을 바탕으로
3자유도계 스프링-질량계(3DOF 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 82 83 84 85 86 87 88 89 90 91 92 93 |
# code from https://youtu.be/oMBohUQz3NI
from visual import * from math import * #------------------------------------------------------------------ # 그래픽 그려주는 코드 #------------------------------------------------------------------ # 그래픽창을 생성합니다 scene.range = (16,12,12) scene.center = (0,0,0) scene.width = 800 scene.height = 300 # 3개의 물체를 생성합니다. 거리는 5m 간격으로 일정합니다 block1 =box(pos=(-5,0,0), size=(2,2,2), color=color.blue, opacity=0.7) block2 = box(pos=(0,0,0), size=(2,2,2), color=color.blue, opacity=0.7) block3 = box(pos=(5,0,0), size=(2,2,2), color=color.blue, opacity=0.7) # 바닥 생성 bottom = box(pos=(0,-1.25,0), size=(20.5,0.5,7)) # 벽 생성 wall1 = box(pos=(-10,1,0), size=(0.5,4,7)) wall2 = box(pos=(10,1,0), size=(0.5,4,7)) # 스프링 생성 spring1 = helix(pos=(-10,0,0), axis=7, radius=0.5, coils=8, thickness=0.1, color=color.gray(0.5)) spring2 = helix(pos=block1.pos, axis=7, radius=0.5, coils=8, thickness=0.1, color=color.gray(0.5)) spring3 = helix(pos=block2.pos, axis=7, radius=0.5, coils=8, thickness=0.1, color=color.gray(0.5)) spring4 = helix(pos=block3.pos, axis=7, radius=0.5, coils=8, thickness=0.1, color=color.gray(0.5)) x1 = 3. # 초기 위치 x2 = 0. x3 = 0. k = 10. # 강성 m = .5 # 질량 v1 = 0. # 초기속도 v2 = 0. v3 = 0. #------------------------------------------------------------------ # 애니메이션 코드 #------------------------------------------------------------------ t = 0 dt = 0.01 label1 = label() label2 = label() label3 = label() while True: rate(100) # 100 Hz, 초당 100번씩 루프를 돌고 dt=0.01이므로 시간 t는 실제 시간과 일치합니다 t += dt # 운동방정식을 통해 a1,a2,a3를 구하고 v,x로 적분합니다 a1 = k/m*(x2 - 2*x1) a2 = k/m*(x3 - 2*x2 + x1) a3 = k/m*(-2*x3 + x2) v1 += a1*dt v2 += a2*dt v3 += a3*dt x1 += v1*dt x2 += v2*dt x3 += v3*dt # 블락의 실시간 위치를 갱신합니다 block1.pos.x = x1-5 block2.pos.x = x2 block3.pos.x = x3+5 # 스프링 또한 블락과 같이 이동합니다 # pos : 스프링 좌측의 좌표 spring2.pos = block1.pos spring3.pos = block2.pos spring4.pos = block3.pos # axis : 스프링 우측의 좌표 spring1.axis = block1.pos.x - wall1.pos.x spring2.axis = block2.pos.x - block1.pos.x spring3.axis = block3.pos.x - block2.pos.x spring4.axis = wall2.pos.x - block3.pos.x label1.pos = wall2.pos + vector(0.1,-3,0) label1.text = 'time : %.2f s' % t label2.pos = wall2.pos + vector(0.1,-4.3,0) label2.text = 'mass : %.1f kg' % m label3.pos = wall2.pos + vector(0.1,-5.6,0) label3.text = 'k : %.2f N/m' % k Colored by Color Scripter |
본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.