nil*_*shi 13 python algorithm representation python-3.x
这是关于为一组并行数据生成图像或任何其他表示的问题.是不是绘图或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.
Run Code Online (Sandbox Code Playgroud)
现在来问题了.有些对象需要图形空间但持续时间为零.我称之为"置换".
exampleTwo-Problematic http://www.wargsang.de/text4120.png
或者我们需要具有持续时间但也有位移的物体.当我们只有一行时,这仍然不是问题,但同步行更复杂,我没有解决方案.
在上图中,红色区块的持续时间为零,并且位移.蓝色块有持续时间,也有移位.
示例:*想象一下每小时不同扬声器插槽的会议时间表(我们的持续时间段).每行代表一个不同的会议室.
黑色块是演讲,可能有一个简短的主题(图形).
蓝色块也是演讲,但主题写得太长,所以我们需要更多的空间.
红色是房间号码变化的笔记.他们不需要自己的时间,但与他们之后的所有项目有关.*
任务是找到一种方法来从上面的函数中计算像素计数器,以便它对于每一行都是正确的,但是一行中的位移会影响所有其他行并在那里创建额外的空间.目标是持续时间固定并在每行中对齐.应该开始的任何事件或间隙,例如,单位计数4,应该从相同的绝对位置开始.
这意味着任何零持续时间/位移对象在实际时间点/持续时间开始但不消耗任何时间/持续时间本身,以便所有后续项目以相同的持续时间开始,直到包括下一个实际持续时间事件.从另一个角度来看,这也意味着零持续时间项始终在具有持续时间的事件之前开始.
在图片中,我们可以在第2列中看到一个相当简单的情况,这也意味着这将启动第二个持续时间槽.尽管该列中有三个真实事件向右移动,因为存在替换项.第4列有一个持续时间项目也有位移.同样,在插槽5中开始的所有项目都向右移动.Colum 6是最有趣的和我真正的问题,我在这里找不到解决方案.同样,第6列中的所有实际事件都向右移动,并且仍然同时开始.但是在这里我们有a)Displacement-Objects分为两行和两行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
]
Run Code Online (Sandbox Code Playgroud)
您需要一个函数将您的时间映射到 x 坐标。困难的是,您有时需要更多空间。这可以通过对象列表来解决,说明何时以及需要多少额外空间。
function timeToLocation(t)
location = t * scale
for (o : extraSpaceList)
if o.when < t
location = location + o.space
return location
Run Code Online (Sandbox Code Playgroud)
每当您尝试放置对象时,发现没有足够的空间(因为元素重叠),只需在所需的时刻插入更多空间即可extraSpaceList.add({when=2s,space=4pixels})
。逐一处理所有行,然后再次处理所有行以获得最终位置。
如果您将对象转换为具有开始时间和图形大小,这会更容易。那么 Gap 和 Event 之间就没有区别了。
归档时间: |
|
查看次数: |
1727 次 |
最近记录: |