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