Извините, я не ответил до сих пор. Так получилось, что в конце я остановился на более простом методе верстки. Этот ответ, безусловно, самый простой способ выполнить то, что я изначально просил :)

я есть (большой) горизонтальный вид с прокруткой и несколько прямоугольников, которые я бы хотел разместить на нем. Каждый прямоугольник имеет желаемое горизонтальное положение, но оно может варьироваться от этого положения до определенного значения (константа, K), если это необходимо. Прямоугольники не должны пересекаться. Вертикальное положение прямоугольников произвольно (конечно, ограничено высотой вида).

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

Теперь в этой компоновке будут невозможности: поскольку существует только определенное количество вертикального пространства, и они могут только отодвинуть K пикселей от своего идеала по горизонтали, вероятно, не все прямоугольники будут нарисованы. Чтобы справиться с этим, у каждого прямоугольника есть приоритет (P), и более низкие приоритеты должны быть сначала опущены. (Вы можете предположить, что это не является двусмысленным, и что вы всегда можете сказать, какой из любых двух прямоугольников имеет более высокий приоритет.)

Я разбираюсь в концептуальных алгоритмах, но если вам нужны подробности, это будет выполнено на iPad, и вам нужно будет рассмотреть несколько тысяч (> 1000, но <10000) прямоугольников. В идеале я хотел бы, чтобы что-то было достаточно быстрым, чтобы каждый раз, когда пользователь изменял уровень масштабирования, запускалось заново, но если это не так просто, я могу кэшировать позиции. Объекты - это фотографии на временной шкале, и я хочу, чтобы они были приблизительно рядом, когда произошло событие - я собираюсь приблизиться к ним, чтобы их было больше.

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

Если решить описанную проблему слишком сложно, я бы приветствовал предложение более прагматичной идеи. Если все остальное терпит неудачу, я всегда мог сделать что-то, где он проходит в порядке приоритета, рендерит каждый элемент в желаемом месте, если он может, если нет, то пытается переместить его вертикально, если все еще нет, то сдвинуть его горизонтально до допустимого предела, прежде чем перейти к следующему. Порядок приоритетов будет означать, что, вероятно, будет найдено неоптимальное решение, но оно будет ориентировано на наиболее важные элементы.

Ответы на вопрос(1)

Ваш ответ на вопрос