Создание линейного представления на основе временной шкалы из элементов, которые потребляют время, и элементов, которые этого не делают, но все же нуждаются в пространстве для рисования

Это вопрос о создании изображения или любых других представлений для набора параллельных данных. Это не про рисование или программирование графического интерфейса, а расчет позиций. Сначала я немного объясню, где я сейчас нахожусь, а второе изображение и пример демонстрируют мою проблему.

Текущий статус

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, сдвинуты вправо. Колонка 6 - самая интересная и моя настоящая проблема, здесь я не могу найти решения. Опять же, все реальные события в столбце 6 смещены вправо и по-прежнему начинаются в одно и то же время. Но здесь у нас есть а) Объекты смещения в два ряда и два б) два объекта, расположенные прямо друг за другом. Таким образом, для реальных событий важно знать полное смещение, но также важно, чтобы второй объект в третьей строке знал, что перед ним есть еще один элемент смещения.

Предупреждение : графическое представление может предлагать табличный подход, когда каждый столбец имеет индивидуальную ширину. Но на этом этот пример заканчивается. Реальное приложение имеет дело с общей продолжительностью 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
            ] 

13
задан nilshi 9 December 2011 в 11:41
поделиться