如何用python制作翻译动画?

2024-06-28 19:24:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在屏幕上的两点之间设置平滑运动的动画。目前,我使用以下python生成器函数来确定绘制图像的点:

#indexes (just for readability)
X=0
Y=1

def followLine(pointA, pointB, speed):
    x1, y1 = pointA
    x2, y2 = pointB
    movement=[0, 0]
    pos=list(pointA)
    diffY=y2-y1
    diffX=x2-x1
    if abs(diffY) > abs(diffX):
        #Y distance is greater than x distace
        movement[Y]=speed
        numFrames=abs(diffY)//speed
        if numFrames==0:
            movement[X]=0
        else:
            movement[X]=abs(diffX)//numFrames
    elif abs(diffY) < abs(diffX):
        #Y distance is less than x distace
        movement[X]=speed
        numFrames=abs(diffX)//speed
        if numFrames==0:
            movement[Y]=0
        else:
            movement[Y]=abs(diffY)//numFrames
    else: #Equal
        movement=[speed]*2

    if diffY < 0:
        #is negative
        movement[Y] *= -1
    if diffX < 0:
        movement[X] *= -1

    yield pointA
    while (abs(pos[X]-x2) > speed)or(abs(pos[Y]-y2) > speed):
        pos[X] += movement[X]
        pos[Y] += movement[Y]
        yield pos
    yield pointB

但是,这有两个问题:

  • 首先,我主要关心的是如果pointApointB相距甚远,或者速度太低,动画将从pointB处经过,并将一直持续到无穷大;

  • 另一个问题是,在动画的结尾,当图像捕捉到位时会有一种震动。这种震动通常很难察觉,但我想试着让动画更流畅。

我该怎么做?我一直在研究trig函数的使用,这似乎很有前途,但我不是一个很懂数学的人,所以我很难理解如何使用trig实现它。在

另外,我使用的是python3.2。在


Tags: posifis动画abselsespeedx2
1条回答
网友
1楼 · 发布于 2024-06-28 19:24:25

我想是缺少信息了。似乎您需要将numFrames参数替换为speed,或者在speed之外添加一个time参数。假设是前者,这个怎么样。请注意,这将生成numFrames+1点,因此pointA和pointB始终分别是第一个和最后一个点,但如果这不是您想要的行为,则更改起来很简单:

def followLine(pointA, pointB, numFrames):
    x1, y1 = pointA
    x2, y2 = pointB
    diffY = float(y2 - y1) /    numFrames
    diffX = float(x2 - x1) /    numFrames

    yield(pointA)
    for f in range(1,numFrames):
    point = (x1 + f * diffX, y1 + f * diffY)
        yield(point)
    yield(pointB)

points = followLine((0,0), (1,1), 10)

# then iterate over the points and do whatever                                                                                                
for p in points:
    print str(p)

相关问题 更多 >