pendulum1.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. from pysketcher import *
  2. H = 7.
  3. W = 6.
  4. drawing_tool.set_coordinate_system(xmin=0, xmax=W,
  5. ymin=0, ymax=H,
  6. axis=False)
  7. #drawing_tool.set_grid(True)
  8. drawing_tool.set_linecolor('blue')
  9. L = 5*H/7 # length
  10. P = (W/6, 0.85*H) # rotation point
  11. a = 40 # angle
  12. vertical = Line(P, P-point(0,L))
  13. path = Arc(P, L, -90, a)
  14. angle = Arc_wText(r'$\theta$', P, L/4, -90, a, text_spacing=1/30.)
  15. rod = Line(P, P + L*point(sin(radians(a)), -L*cos(radians(a))))
  16. # or shorter (and more reliable)
  17. mass_pt = path.geometric_features()['end']
  18. rod = Line(P, mass_pt)
  19. mass = Circle(center=mass_pt, radius=L/20.)
  20. mass.set_filled_curves(color='blue')
  21. rod_vec = rod.geometric_features()['end'] - \
  22. rod.geometric_features()['start']
  23. unit_rod_vec = unit_vec(rod_vec)
  24. mass_symbol = Text('$m$', mass_pt + L/10*unit_rod_vec)
  25. length = Distance_wText(P, mass_pt, '$L$')
  26. # Displace length indication
  27. length.translate(L/15*point(cos(radians(a)), sin(radians(a))))
  28. gravity = Gravity(start=P+point(0.8*L,0), length=L/3)
  29. def set_dashed_thin_blackline(*objects):
  30. """Set linestyle of objects to dashed, black, width=1."""
  31. for obj in objects:
  32. obj.set_linestyle('dashed')
  33. obj.set_linecolor('black')
  34. obj.set_linewidth(1)
  35. set_dashed_thin_blackline(vertical, path)
  36. fig = Composition(
  37. {'body': mass, 'rod': rod,
  38. 'vertical': vertical, 'theta': angle, 'path': path,
  39. 'g': gravity, 'L': length, 'm': mass_symbol})
  40. fig.draw()
  41. drawing_tool.display()
  42. drawing_tool.savefig('tmp_pendulum1')
  43. # Draw body diagram in several different versions
  44. # (note that we build body_diagram, erase and draw,
  45. # add elements to body_diagram, erase and draw, and so on)
  46. input('Press Return to make body diagram: ')
  47. drawing_tool.erase()
  48. drawing_tool.set_linecolor('black')
  49. rod_start = rod.geometric_features()['start'] # Point P
  50. vertical2 = Line(rod_start, rod_start + point(0,-L/3))
  51. set_dashed_thin_blackline(vertical2)
  52. set_dashed_thin_blackline(rod)
  53. angle2 = Arc_wText(r'$\theta$', rod_start, L/6, -90, a,
  54. text_spacing=1/30.)
  55. mg_force = Force(mass_pt, mass_pt + L/5*point(0,-1),
  56. '$mg$', text_pos='end')
  57. rod_force = Force(mass_pt, mass_pt - L/3*unit_vec(rod_vec),
  58. '$S$', text_pos='end',
  59. text_spacing=(0.03, 0.01))
  60. air_force = Force(mass_pt, mass_pt -
  61. L/6*unit_vec((rod_vec[1], -rod_vec[0])),
  62. '$\sim|v|v$', text_pos='end',
  63. text_spacing=(0.04,0.005))
  64. body_diagram = Composition(
  65. {'mg': mg_force, 'S': rod_force, 'rod': rod,
  66. 'vertical': vertical2, 'theta': angle2,
  67. 'body': mass, 'm': mass_symbol})
  68. body_diagram.draw()
  69. #drawing_tool.display('Body diagram')
  70. drawing_tool.savefig('tmp_pendulum2')
  71. drawing_tool.adjust_coordinate_system(body_diagram.minmax_coordinates(), 90)
  72. #drawing_tool.display('Body diagram')
  73. drawing_tool.savefig('tmp_pendulum3')
  74. drawing_tool.erase()
  75. body_diagram['air'] = air_force
  76. body_diagram.draw()
  77. #drawing_tool.display('Body diagram')
  78. drawing_tool.savefig('tmp_pendulum4')
  79. drawing_tool.erase()
  80. x0y0 = Text('$(x_0,y_0)$', P + point(-0.4,-0.1))
  81. ir = Force(P, P + L/10*unit_vec(rod_vec),
  82. r'$\boldsymbol{i}_r$', text_pos='end',
  83. text_spacing=(0.015,0))
  84. ith = Force(P, P + L/10*unit_vec((-rod_vec[1], rod_vec[0])),
  85. r'$\boldsymbol{i}_{\theta}$', text_pos='end',
  86. text_spacing=(0.02,0.005))
  87. body_diagram['ir'] = ir
  88. body_diagram['ith'] = ith
  89. body_diagram['origin'] = x0y0
  90. body_diagram.draw()
  91. #drawing_tool.display('Body diagram')
  92. drawing_tool.savefig('tmp_pendulum5')
  93. input()