Это вопрос о создании изображения или любых других представлений для набора параллельных данных. Речь идет не о рисовании или графическом программировании, а о вычислении позиций. Сначала я немного объясню, где я стою прямо сейчас, а второе изображение и пример показывают мою проблему.
Текущее состояние
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-Problematic http://www.wargsang.de/text4120.png
Или нам нужны объекты, которые имеют продолжительность, но также имеют смещение. Это все еще не проблема, когда у нас есть только одна строка, но синхронизация строк сложнее, и у меня нет решения для этого.
На рисунке выше красные блоки имеют нулевую длительность и смещаются. Синие блоки имеют длительность и тоже смещены.
Пример: * Представьте себе график проведения конференции с различными слотами динамиков каждый час (наши интервалы продолжительности). Каждая строка представляет собой другой конференц-зал.
-
Черные блоки - это речи и, возможно, содержат короткую тему, написанную внутри них (графически).
-
Синие блоки также являются речами, но тема слишком длинная, чтобы писать, поэтому нам нужно больше места один раз.
-
Красный - это заметки, как изменение номера комнаты. Они не занимают время самостоятельно, но относятся ко всем предметам, которые приходят после них. *
Задача состоит в том, чтобы найти способ калибровки пиксельного счетчика из вышеприведенной функции, чтобы он был правильным для каждой строки, но также и то, что перемещение в одной строке влияет на все остальные строки и создает там дополнительное пространство. Цель состоит в том, что длительности фиксируются и выравниваются в каждой строке. Любое событие или пробел, который должен начинаться, например, счетчик единиц 4, должен начинаться в том же абсолютном положении.
Это означает, что любой объект с нулевой продолжительностью/перемещением начинается в реальном времени по времени/длительности, но не потребляет самого времени и продолжительности, так что все последующие элементы начинаются с той же самой продолжительностью, пока не будет включено следующее событие реальной продолжительности, С другой точки зрения это также означает, что элементы с нулевой длительностью всегда начинаются до событий, имеющих длительность.
На рисунке мы видим довольно простой случай в столбце 2, что также означает, что он запускает второй временной интервал. Несмотря на то, что в этом столбце есть три реальных события, которые сдвинуты вправо, потому что здесь находится элемент смещения. В столбце 4 есть элемент продолжительности, который также имеет смещение. Опять же, все предметы, которые начинаются в слоте 5, сдвигаются вправо. Colum 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
]