这是一个关于为一组并行数据生成图像或任何其他表示的问题。不是关于绘图或 GUI 编程,而是计算位置。首先,我将解释一下我现在的立场,第二张图片和示例显示了我的问题。
当前状态
exampleOne-Easy http://www.wargsang.de/text3935.png
我有一维对象,但它们通过将它们放置在平行的“线”上来对齐。让我们将此一维对象称为“事件”,它具有“持续时间”作为时间单位。这些事件有一个变体,没有任何事情发生,对象没有数据但有一个持续时间;一个“间隙”对象。
所以我们得到了一个包含事件和间隙的模拟对象的时间表,这很容易作为三个对象列表来处理。可视化也很简单:遍历列表并根据其持续时间绘制每个对象。
class Event():
def __init__(self, duration, displacement = 0): #displacement is explained in the second example and the core problem of this question
self.duration = duration
self.displacement = displacement
#additional data
def self.draw(self, start_coordinate):
"""draw duration * 10 pixels in black"""
#drawing code using start_coordinate to place the drawn object. see example graphic
return duration * 10
class Gap():
def __init__(self, duration, displacement = 0):
self.duration = duration
self.displacement = displacement
#no data
def self.draw(self, start_coordinate):
"""draw duration * 10 pixels in transparent"""
#drawing code using start_coordinate to place the drawn object. see example graphic
return duration * 10
row_one = [Event(1), Gap(1), Event(1), Gap(1), Event(1), Gap(1), Event(2)]
row_two = [Event(1), Gap(2), Event(1), Event(1), Gap(1), Event(1), Gap(1), ]
row_thr = [Gap(1), Event(1), Gap(1), Event(1), Gap(1), Event(3),]
timetable = [row_one, row_two, row_thr]
for row in timetable:
pixelcounter = 0 # the current position.
for item in row:
ret = item.draw(pixelcounter) #draw on the current position. Get how width the item was
pixelcounter += ret #save width for the next iteration
#instructions to move the "drawing cursor" down a few pixels so the next row does not overlap.
问题
现在来解决问题。有些对象需要图形空间但持续时间为零。我称之为“位移”。
exampleTwo-有问题的 http://www.wargsang.de/text4120.png
或者我们需要有持续时间但也有位移的对象。当我们只有一行时,这仍然不是问题,但是同步行更复杂,我没有解决方案。
在上图中,红色块的持续时间为零并且被移位。蓝色方块有持续时间,也会被移位。
示例:*想象一个会议时间表,每小时有不同的演讲者时段(我们的时长时段)。每行代表一个不同的会议室。
黑块是演讲,其中可能有一个简短的主题(以图形方式)。
蓝块也是演讲稿,但题目太长,写不出来,所以我们需要更多的空间一次。
红色是房间号更改之类的注释。他们不占用自己的时间,而是与他们之后的所有项目相关。*
任务是找到一种从上面的函数计算像素计数器的方法,以便仅对每一行都正确,而且一行中的位移会影响所有其他行并在那里创建额外的空间。目标是持续时间是固定的并在每一行中对齐。任何应该开始的事件或间隙,例如,unit-count 4,应该从相同的绝对位置开始。
这意味着任何零持续时间/位移对象从一个真实的时间/持续时间点开始,但不消耗任何时间/持续时间本身,因此所有后续项目都以相同的持续时间开始,直到包含下一个真实持续时间事件。从另一个角度来看,这也意味着零持续时间项目总是在具有持续时间的事件之前开始。
在图片中,我们可以在第 2 列中看到一个相当简单的情况,这也意味着这开始了第二个持续时间槽。尽管该列中有三个实际事件向右移动,因为那里有一个置换项目。第 4 列有一个持续时间项目,它也有位移。同样,从插槽 5 开始的所有项目都向右移动。第 6 列是最有趣也是我真正的问题,我在这里找不到解决方案。同样,第 6 列中的所有真实事件都向右移动,并且仍然同时开始。但是这里我们有 a) 两行中的置换对象和两个 b) 两个紧挨着的对象。因此,对于真实事件来说,知道完整的位移很重要,但对于第三行中的第二个对象来说,知道它之前还有一个位移项也很重要。
警告:图形表示可能建议使用基于表格的方法,其中每列都有单独的宽度。但这就是这个例子结束的地方。实际应用程序处理每个事件的常见持续时间为 300-10,000,但持续时间为 1 的可能性不大,但在技术上是可行的。因此,该表的列宽为一个持续时间。考虑到我们进入了数十万个完整的持续时间(乘以行数),这可能会降低性能。
这张图片的数据看起来像这样。如何使用此数据绘制第二张图像?或者需要改变什么,我愿意接受所有建议。
非常感谢您的时间和兴趣。如果您不知道解决方案,请随时向我提问或向我展示我的概念的缺陷,这也会帮助我思考。
row_one = [ Event(1), #1
Event(0,1), Event(1), #2
Gap(1), #3
Event(1), #4
Gap(1), #5
Event(0,1), Event(1), #6
Event(1), #7
]
row_two = [ Event(1), #1
Event(1), #2
Gap(1), #3
Event(1, 0.5), #4, 0,5 is not important. we can also simply to just ints. The important bit is that it has both values.
Event(1), #5
Event(1), #6
Event(1), #7
]
row_thr = [ Event(1), #1
Event(1), #2
Event(1), #3
Event(1), #4
Event(1), #5
Event(0,1), Event(0,1), Event(1), #6 #Please pay attention to this case.
Event(1), #7
]