为动画线图生成数据的算法

时间:2016-08-06 21:59:19

标签: python algorithm animation graph

我正在处理描述包含许多部分的流程进度的数据。每个部分都有许多里程碑。部件不相等,但给出了比率。 我想制作一个动画线图作为最终结果。 对于流程的每个部分,都有几个里程碑。我需要计算当前的完成时间,作为每个部分在很多不同时间的百分比。不同的时间对应于'框架'动画。

包含三个里程碑的示例数据:

Task1, 22  , 24.5 , 27.6  
Task1, 30% , 35%  , 35% 

Frames 0-21  :  y = 0  
Frame  22:  y = 30%  
Frame  23:  y = 30% + 35% *(23-22/24.5-22)  
Frame  24:  y = 30% + 35% *(24-22/24.5-22)  
Frame  25:  y = 30% + 35% + (25-24.4/27.6-24-5)  
Frame  26:  y = 30% + 35% + (26-24.4/27.6-24-5)  
Frame  27:  y = 30% + 35% + (27-24.4/27.6-24-5)  
Frame  28+  y = 30% + 35% + 35%  

这假设在到达第一个里程碑之前,子任务上没有工作。

我想在python中创建一个函数,它接受任务和比率作为列表,以及最大帧号,并返回每个帧的值列表。 这是我到目前为止所尝试的不正确的。

from math import floor, ceil
from itertools import chain

data = [[1,2.5,4.5,7],[4,6,9,11],[0,0,9,11],[1,1,1,9]]
ratios = [[25,20,20,35],[30,30,30,10],[0,0,50,50],[10,10,15,65]]

frame_count = int(ceil(max(chain.from_iterable(data))+1))
print "frame count is ", frame_count
frame_times = range(0,frame_count)
print "frame_times are " , frame_times

frames = []

for r, part in enumerate(data):
ratio = ratios[r]
y_list = []
print "part is ", part
print "ratios are ", ratio

for i in range(len(part)-1):
    Tlast = part[i]
    Tnext = part[i+1]
    Rlast = ratio[i]

    for frame in frame_times:
        print "frame : %r, Tlast: %r , Tnext: %r" %(frame, Tlast,Tnext)
        if frame == 0 or (frame < Tlast and max(y_list) == 0):
            y_list.append(0)
            print "%r appended" %(y_list[-1])
            continue
        elif frame == Tlast :
            y_list.append(y_list[-1] + ratio[i])
            print "%r appended" %(y_list[-1])
            continue
        elif Tlast < frame and frame < Tnext:
            y_list.append(y_list[-1] + ratio[i] * ((frame-Tlast)/(Tnext-Tlast)))
            print "%r appended" %(y_list[-1])
            continue
        else :
            print "Problem occured no value found for frame."
            print "y_list is ", y_list
            exit()
    frames.append(y_list)

print "Data points are"
print data

print "ratios are ", ratio
print ratio

print "y_list is ", y_list  

非常感谢有关如何纠正此问题并改进方法的任何建议。

我想知道将帧作为中间循环并将数据点作为内循环是否更好。我不知道如何编码两个循环不相互独立的地方。像这样:

loop through the frames:  
    while frame < Tlast :
       y_list.append(calculate y)  
       increment frame

    increment Tlast
    increment Tnext

    while Tlast < frame < Tnext : 
         y_list.append(calculate y)
         increment frame
    increment Tlast
    increment Tnext

    while frame > Tnext :
        y_list.append(calculate y)
        increment Tnext
        check whether to increment frame and continue

0 个答案:

没有答案