使用Python演示三力动态平衡

发布时间: 2022年11月29日 星期二   专辑:Python  


物体在三个力的作用下处于平衡状态,当束缚物体的条件缓慢改变时,物体仍可视为处于平衡状态,我们把这状态下物体所受的三个力称为三力动态平衡。

高中物理中的三力动态平衡问题,通常有以下三个力:一个是大小、方向不变的恒力(一般是重力),另一个是方向不变、大小变化的力,最后一个是大小方向变化的力。处于动态平衡的三个力合力为零,始终构成一个矢量三角形。利用三个力的这一特点,能快速求解各力的变化规律。

使用 Python 可以很方便地绘制如下的示意图。

三力动态平衡矢量三角形

源代码如下:

'绘制三个力的矢量三角形以求解三力动态平衡问题'
from PIL import Image, ImageDraw
from math import floor, sqrt

def draw_arrow(draw, x1, y1, x2, y2, color):
    arrow_size = 10
    c = sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
    sin_a = (y2 - y1) / c
    cos_a = (x2 - x1) / c
    sin_r = arrow_size * sin_a
    cos_r = arrow_size * cos_a
    if arrow_size * 3 < c:
      x = x2 - cos_r * 3
      y = y2 - sin_r * 3
    else:
      x = x1
      y = y1
    draw.line((x1, y1, x, y), color, 3)
    draw.polygon((x - sin_r, y + cos_r, x + sin_r, y - cos_r, x2, y2), color)
  

def create_frame(width, height, margin, steps, step):
  img = Image.new('RGB', (width, height), (255, 255, 255))
  draw = ImageDraw.Draw(img)
  x1 = width - margin
  y1 = round(margin * 0.75)
  x2 = x1
  y2 = height - y1
  draw_arrow(draw, x1, y1, x2, y2, 'green')
  
  x3, y3 = x1 - 12, y1 + 16
  for i in range(floor(steps * 0.24)):
    x4 = x3 - 12
    y4 = y3 + 16
    draw.line((x3, y3, x4, y4), 'orange', 1)
    x3, y3 = x4 - 12, y4 + 16   
  
  x3, y3 = x2, y2
  if step:
    x4 = x2 - step * 16
    y4 = y2 - step * 12
    draw_arrow(draw, x2, y2, x4, y4, 'blue')
    draw_arrow(draw, x4, y4, x1, y1, 'red')
    x3, y3 = x4, y4
    
  if step % 2 == 0:
    x3 -= 16
    y3 -= 12
  while x3 - 16 > margin:
    x4 = x3 - 16
    y4 = y3 - 12
    draw.line((x3, y3, x4, y4), 'orange', 1)
    x3, y3 = x4 - 16, y4 - 12
    
  return img

  
def create_anim():
  width = 800
  height = 600
  margin = 46

  # 绘图区域固定为 4:3
  steps = floor((width - margin * 2) * 1.25 / 20) - 1

  frames = []
  for i in range(steps):
    frames.append(create_frame(width, height, margin, steps, i))
  frames[0].save('tri_forces.gif', format='GIF', append_images=frames[1:], save_all=True, duration=400, loop=0)

  
create_anim()
print('OK')

相关文章