我写了一个程序,但我需要修改我的python程序

时间:2015-02-26 23:04:46

标签: python turtle-graphics

我写的程序打印出一个sin波,我需要修改它以便每次都反弹一点。最后,每次弹跳都应该离开屏幕顶部。 我认为唯一需要改变的是球的高度。随着时间的增加,我怎样才能让高度变大?看起来像like this

from turtle import*
from math import*
def main():

    velocity = .5
    amplitude = 75
    frequency = .01

    win = Screen()
    ball = Turtle()
    ball.speed(10)
    win.setworldcoordinates(0.0, -100.0, 500.0, 100.0)

    ball.up()
    goto(0,0)
    ball.down()
    ball.forward(500)
    ball.up()
    ball.backward(500)
    ball.down()

    for time in range(500):
        ball.goto(time,int(time*sin(frequency*time*2*pi)))

    win.exitonclick()



main()

1 个答案:

答案 0 :(得分:1)

在您所指的图片中,

enter image description here

发生了两件事:

  1. 幅度随着x

    而增加
    • 在x == 10时,振幅约为0.45
    • 在x == 40时,振幅约为0.90
    • amp倍增为x四倍 - 等式看起来像amp(x) = c1 * x ** 0.5

      经过一些数学计算,c1约为0.142,所以

      amp(x) = 0.142 * x ** 0.5
      
  2. 频率随着x

    而下降
    • 在x == 10附近,f约为0.2(8至13是一个循环)
    • 在x == 30附近,f约为0.07(25至39是一个周期)
    • f将三除以x三元组 - 等式看起来像freq(x) = c2 / x

    但是为了绘制正弦波,你真的想要相位,而不是频率!相位与频率的积分成正比,因此应该类似于phase(x) = c3 * log(x) + c4

    • 我们将在x = 10时任意设置零点,因此phase(10) = 0c4 = -c3 * log(10)
    • 计算峰值,phase(40) = 6*pi如此

      6 * pi == c3 * log(40) - c3 * log(10)
      
      c3 = 6 * pi / (log(40) - log(10)) = 13.6
      c4 = -31.3
      
      phase(x) = 13.6 * log(x) - 31.3
      
  3. 所以你的函数应该看起来像

    from math import log, pi, sin
    
    def y(x):
        amp = 0.142 * x ** 0.5
        phase = 13.6 * log(x) - 31.3
        return amp * sin(phase)