Как разделить ряд перекрывающихся диапазонов на неналожение диапазонов?

Похоже, что используемая вами библиотека вызывает метод andSelf из библиотеки jQuery. Этот метод устарел в пользу addBack.

Я могу предложить обновить ваши зависимости, чтобы убедиться, что вы используете последние поддерживаемые и совместимые версии библиотек.

Если это не работает, вы можете:

  1. Редактировать источник - перейти в файл owl.carousel.min.js и заменить все andSelf с addBack.
  2. Патч обезьяны jQuery - объявите новую функцию в вашем объекте jQuery, которая делегирует существующий метод addBack. Для этого вы должны создать функцию до того, как owl-carousel попытается ее вызвать. Вы можете выполнить это в своем файле app.module.ts или в любом другом месте, которое будет проанализировано раньше, чем owl-carousel.

    $.fn.andSelf = function() {
      return this.addBack.apply(this, arguments);
    }
    

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

10
задан Ron Eggbertson 10 March 2009 в 03:21
поделиться

4 ответа

У меня был тот же вопрос при записи программы для смешивания (частично накладывающийся) аудиосэмплы.

То, что я сделал, было, добавляют, "запускают событие" и "событие остановки" (для каждого объекта) к списку, сортируют список по моменту времени и затем обрабатывают его в порядке. Вы могли сделать то же, кроме использования целочисленной точки вместо времени, и вместо того, чтобы смешать звуки, Вы будете добавлять символы к набору, соответствующему диапазону. Генерировали ли Вы пустые диапазоны или просто опустили бы их, будет дополнительным.

Edit Возможно, некоторый код...

# input = list of (start, stop, symbol) tuples
points = [] # list of (offset, plus/minus, symbol) tuples
for start,stop,symbol in input:
    points.append((start,'+',symbol))
    points.append((stop,'-',symbol))
points.sort()

ranges = [] # output list of (start, stop, symbol_set) tuples
current_set = set()
last_start = None
for offset,pm,symbol in points:
    if pm == '+':
         if last_start is not None:
             #TODO avoid outputting empty or trivial ranges
             ranges.append((last_start,offset-1,current_set))
         current_set.add(symbol)
         last_start = offset
    elif pm == '-':
         # Getting a minus without a last_start is unpossible here, so not handled
         ranges.append((last_start,offset-1,current_set))
         current_set.remove(symbol)
         last_start = offset

# Finish off
if last_start is not None:
    ranges.append((last_start,offset-1,current_set))

Полностью непротестированный, очевидно.

12
ответ дан 3 December 2019 в 22:39
поделиться

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

Это, вероятно, лучше представлено в коде..., если Ваши диапазоны представлены кортежами:

ranges = [(0,100,'a'),(0,75,'b'),(95,150,'c'),(120,130,'d')]
endpoints = sorted(list(set([r[0] for r in ranges] + [r[1] for r in ranges])))
start = {}
end = {}
for e in endpoints:
    start[e] = set()
    end[e] = set()
for r in ranges:
    start[r[0]].add(r[2])
    end[r[1]].add(r[2])
current_ranges = set()
for e1, e2 in zip(endpoints[:-1], endpoints[1:]):
    current_ranges.difference_update(end[e1])
    current_ranges.update(start[e1])
    print '%d - %d: %s' % (e1, e2, ','.join(current_ranges))

Хотя смотря на это ретроспективно, я был бы удивлен, не было ли более эффективного (или по крайней мере чище выглядящего) способ сделать это.

1
ответ дан 3 December 2019 в 22:39
поделиться

То, что Вы описываете, является примером теории множеств. Для общего алгоритма для вычислительных объединений видят пересечения и различия наборов:

www.gvu.gatech.edu/~jarek/graphics/papers/04PolygonBooleansMargalit.pdf

В то время как бумага предназначена для графики, это применимо к общей теории множеств также. Не точно материал легкого чтения.

1
ответ дан 3 December 2019 в 22:39
поделиться

Псевдокод:

unusedRanges = [ (each of your ranges) ]
rangesInUse = []
usedRanges = []
beginningBoundary = nil

boundaries = [ list of all your ranges' start and end values, sorted ]
resultRanges = []

for (boundary in boundaries) {
    rangesStarting = []
    rangesEnding = []

    // determine which ranges begin at this boundary
    for (range in unusedRanges) {
        if (range.begin == boundary) {
            rangesStarting.add(range)
        }
    }

    // if there are any new ones, start a new range
    if (rangesStarting isn't empty) {
        if (beginningBoundary isn't nil) {
            // add the range we just passed
            resultRanges.add(beginningBoundary, boundary - 1, [collected values from rangesInUse])
        }

        // note that we are starting a new range
        beginningBoundary = boundary

        for (range in rangesStarting) {
            rangesInUse.add(range)
            unusedRanges.remove(range)
        }
    }

    // determine which ranges end at this boundary
    for (range in rangesInUse) {
        if (range.end == boundary) {
            rangesEnding.add(range)
        }
    }

    // if any boundaries are ending, stop the range
    if (rangesEnding isn't empty) {
        // add the range up to this boundary
        resultRanges.add(beginningBoundary, boundary, [collected values from rangesInUse]

        for (range in rangesEnding) {
            usedRanges.add(range)
            rangesInUse.remove(range)
        }

        if (rangesInUse isn't empty) {
            // some ranges didn't end; note that we are starting a new range
            beginningBoundary = boundary + 1
        }
        else {
            beginningBoundary = nil
        }
    }
}

Модульный тест:

В конце resultRanges должен иметь результаты, которые Вы ищете, unusedRanges, и rangesInUse должен быть пустым, beginningBoundary должен быть нолем, и usedRanges должен содержать то, что unusedRanges раньше содержал (но отсортированный по range.end).

0
ответ дан 3 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: