回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>这是一个关于为一组并行数据生成图像或任何其他表示的问题。不是关于绘图或GUI编程,而是计算位置。
首先,我将解释一下我现在的立场,第二张图片和示例展示了我的问题。在</p>
<h2>现状</h2>
<p><a href="http://www.wargsang.de/text3935.png">exampleOne-Easy http://www.wargsang.de/text3935.png</a></p>
<p>我有一个一维的物体,但它们是通过把它们放在平行的“直线”上对齐的。我们把这个一维对象称为“事件”,它以“持续时间”为时间单位。
这些事件有一个变量,其中没有发生任何事情,对象没有数据,只有持续时间;一个“间隙”对象。在</p>
<p>因此,我们得到了一个由事件和间隙组成的模拟对象的时间表,它很容易作为三个对象列表来处理。
可视化也很简单:在列表上循环并根据其持续时间绘制每个对象。在</p>
<pre><code>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.
</code></pre>
<h2>问题</h2>
<p>现在是问题。有些对象需要图形空间,但持续时间为零。
我称之为“位移”。在</p>
<p><a href="http://www.wargsang.de/text4120.png">exampleTwo-Problematic http://www.wargsang.de/text4120.png</a></p>
<p>或者我们需要有持续时间但也有位移的物体。
当我们只有一行时,这仍然不是问题,但是同步行更复杂,我没有解决方案。在</p>
<p>在上图中,红色方块的持续时间为零,并被替换。蓝色方块有持续时间,也会被取代。在</p>
<p><strong>示例</strong>:
*想象一下一个会议的时间表,每小时有不同的演讲者时段(我们的时段)。每一行代表一个不同的会议室。在</p>
<ul>
<li><p>黑色方块是演讲稿,可能有一个简短的主题(以图形方式)写在里面。</p></li>
<li><p>蓝色方块也是演讲稿,但主题太长,写不下,所以我们需要更多的空间。</p></li>
<li><p>红色是房间号码的变化。它们不需要自己花时间,而是与后面的所有项目相关。*</p></li>
</ul>
<p>任务是从上面的函数中找到一种计算像素计数器的方法,这样每一行都是正确的,但是一行中的位移会影响所有其他行,并在那里创建额外的空间。
目标是在每一行中固定和对齐持续时间。任何应该开始的事件或间隔,例如,单位计数4,都应该从相同的绝对位置开始。在</p>
<p>这意味着,任何零持续时间/置换对象从实际时间/持续时间点开始,但不会消耗任何时间/持续时间本身,因此所有后续项目都从相同的持续时间开始,直到包含下一个实际持续时间事件。从另一个角度来看,这也意味着零持续时间项总是在具有持续时间的事件之前开始。在</p>
<p>在图中,我们可以在第2列看到一个相当简单的情况,这也意味着这将开始第二个持续时间槽。尽管该列中有三个实际事件被右移,因为那里有一个置换项。
第4列有一个持续时间项,它也有位移。同样,所有从插槽5开始的项目都会向右移动。
哥伦布6是最有趣也是我真正的问题,我在这里找不到解决办法。同样,第6列中的所有实际事件都向右移动,并且仍然同时开始。但是这里我们有两排位移物体和两个物体,两个物体在彼此后面。
所以,对于真实事件来说,知道完整的位移是很重要的,但是对于第三排的第二个物体来说,知道在它前面还有一个位移项也是很重要的。在</p>
<p><strong>警告</strong>:图形表示可能建议使用基于表的方法,其中每个列都有单独的宽度。但这就是这个例子的结尾。实际应用程序处理的公共持续时间为300-10000个事件,但持续时间不太可能为1,但在技术上是可能的。因此表的列宽为一个持续时间。考虑到我们进了十万完整持续时间(乘以行数)这可能会降低性能。在</p>
<p>这张照片的数据应该是这样的。如何用这些数据绘制第二幅图像?或者需要改变的地方,我愿意接受所有的建议。在</p>
<p>非常感谢您的时间和兴趣。如果你不知道一个解决方案,请不要犹豫,问我问题,或让我看看我的概念的缺陷,这将有助于我思考。在</p>
^{pr2}$