一种生成动画线图数据的算法

2024-05-16 13:40:09 发布

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

我处理的数据描述了一个包含许多部分的过程的进度。每个部分都有许多里程碑。各部分不相等,但给出了比率。 我想产生一个动画线图作为最终结果。 过程的每一部分都有几个里程碑。我需要计算当前完成,作为一个百分比,为每个部分在许多不同的时间。不同的时间对应于动画的“帧”。你知道吗

具有三个里程碑的示例数据:

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中创建一个函数,它接受task和ratio作为一个列表,以及一个最大帧数,并为每个帧返回一个值列表。 这是我到目前为止所尝试的,这是不正确的。你知道吗

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

Tags: dataiscountframelistprintpart里程碑