0

画面上の 2 点間の滑らかな動きをアニメーション化しようとしています。現時点では、次の 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

ただし、これには 2 つの問題があります。

  • まず、私の主な懸念は、pointApointBが非常に離れている場合、または速度が遅すぎる場合、アニメーションがすぐに通過しpointB、無限に進み続けることです。

  • もう 1 つの問題は、アニメーションの最後に、画像が所定の位置にスナップするときに、ある種の衝撃があることです。通常、この衝撃はほとんど感じられませんが、アニメーションをよりスムーズにするように努めたいと思います。

これどうやってするの?私は三角関数の使用を検討しており、それは有望に思えますが、私は数学にあまり詳しくないので、三角関数を使用してそれを実装する方法を正確に理解するのに苦労しています.

また、私は Python 3.2 を使用しています。

4

1 に答える 1

0

不足している情報があると思います。numFramesをarg に置き換えるか、 に加えてarg をspeed追加する必要があるようです。前者だとすると、これはどうでしょうか。これは numFrames+1 個のポイントを生成するので、pointA と pointB はそれぞれ常に最初と最後のポイントになりますが、それが必要な動作でない場合は簡単に変更できます。timespeed

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)
于 2013-01-14T23:19:51.607 に答える