如何用python制作翻译动画?
我试图在屏幕上的两点之间设置平滑运动的动画。目前,我正在使用以下python生成器函数来确定绘制图像的点:如何用python制作翻译动画?,python,animation,python-3.x,trigonometry,Python,Animation,Python 3.x,Trigonometry,我试图在屏幕上的两点之间设置平滑运动的动画。目前,我正在使用以下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
#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
#索引(仅用于可读性)
X=0
Y=1
def followLine(点A、点B、速度):
x1,y1=点A
x2,y2=点B
移动=[0,0]
pos=列表(点A)
diffY=y2-y1
diffX=x2-x1
如果abs(diffY)>abs(diffX):
#Y距离大于x距离
运动[Y]=速度
numFrames=abs(diffY)//速度
如果numFrames==0:
移动[X]=0
其他:
运动[X]=abs(diffX)//numFrames
elif abs(diffY)速度)或(abs(位置[Y]-y2)>速度):
位置[X]+=移动[X]
pos[Y]+=移动[Y]
收益率位置
屈服点B
但是,这有两个问题:
- 首先,我主要担心的是,如果
和点A
相距很远,或者如果速度太低,动画将直接经过点B
,并将继续无限远点B
- 另一个问题是,在动画结束时,图像捕捉到位时会出现某种震动。这种震动通常是相当难以察觉的,但我想尝试使动画更平滑
另外,为了值得,我使用了Python 3.2。我认为缺少信息。似乎您需要用
numFrames
arg替换speed
,或者在speed
之外添加time
arg。假设是前者,这个怎么样。请注意,这将生成numFrames+1点,因此点A和点B始终分别是第一个点和最后一个点,但如果这不是您想要的行为,则这一点很容易更改:
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)
时间实际上是由程序的另一部分管理的,它每帧对生成器调用一次
next()
,而speed
则意味着更多地沿着每帧移动的距离。但是谢谢,你让我走上了正确的道路。我把arg改回speed,用int(max((abs(y2-y1),abs(x2-x1))/speed计算numFrames
,并对输出进行四舍五入(因为我需要int
格式),为循环缩进thar的第一行,结果非常好。