我写的程序打印出一个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()
答案 0 :(得分:1)
在您所指的图片中,
发生了两件事:
幅度随着x
amp倍增为x四倍 - 等式看起来像amp(x) = c1 * x ** 0.5
经过一些数学计算,c1约为0.142,所以
amp(x) = 0.142 * x ** 0.5
频率随着x
freq(x) = c2 / x
但是为了绘制正弦波,你真的想要相位,而不是频率!相位与频率的积分成正比,因此应该类似于phase(x) = c3 * log(x) + c4
phase(10) = 0
和c4 = -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
所以你的函数应该看起来像
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)