我试图在屏幕上的两点之间设置平滑运动的动画。目前,我正在使用以下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
然而,这有两个问题:
首先,我主要担心的是,如果pointA
和pointB
距离很远,或者速度太低,动画会直接传递pointB
,并将继续为无限;
另一个问题是,在动画结束时,当图像卡入到位时会出现一种颠簸。这种颠簸通常是难以察觉的,但我想尝试使动画更流畅。
我该怎么做?我一直在研究使用trig函数,这似乎很有希望,但我不是一个数学家,所以我很难理解我将如何使用trig实现它。
另外,为了我的价值,我正在使用Python 3.2。
答案 0 :(得分:0)
我认为缺少信息。您似乎需要将numFrames
arg替换为speed
,或者在time
之外添加speed
arg。假设前者,这个怎么样。请注意,这会生成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)