Repartir rectángulos para evitar colisiones (ayuda de algoritmos)

Tengo una vista de desplazamiento horizontal (grande) y un montón de rectángulos que me gustaría colocar en ella. Cada rectángulo tiene una posición horizontal deseada, pero puede variar desde esa posición hasta una cierta cantidad (una constante, K) si es necesario. Los rectángulos no deben superponerse. La posición vertical de los rectángulos es arbitraria (limitada a la altura de la vista, por supuesto).

Idealmente me gustaría que el tamaño de los rectángulos sea variable ... Supongo que si eso no es posible, puedo hacer que el tamaño varíe en una sola dimensión.

Ahora, habrá imposibilidades en este diseño: dado que solo hay una cierta cantidad de espacio vertical, y solo pueden alejar K píxeles de su horizontal ideal, probablemente no todos los rectángulos podrán dibujarse. Para lidiar con esto, cada rectángulo tiene una prioridad (P), y los de menor prioridad deben omitirse primero. (Puede suponer que eso no es ambiguo y que siempre puede saber cuál de los dos rectángulos tiene la mayor prioridad).

Me interesan las cosas del algoritmo conceptual, pero si necesita detalles, esto se ejecutará en un iPad, y habrá algunos miles (> 1000 pero <10,000) rectángulos para considerar. Idealmente, me gustaría algo lo suficientemente rápido como para volver a ejecutarlo cada vez que el usuario cambie el nivel de zoom, pero si eso no es fácil, entonces puedo guardar en caché las posiciones. Los objetos son fotos en una línea de tiempo, y quiero acercarlos aproximadamente cuando ocurrió el evento; voy a hacer una aproximación para obtener más de ellos allí.

He visto algoritmos comoest, que hacen el truco de no intersección, pero no tienen la misma idea de que cada elemento solo puede moverse hasta una cierta cantidad. Obviamente, sin la última restricción, puede mostrar todos los elementos, por lo que también necesitaré alguna forma de saber en qué punto no se pueden mostrar más rectángulos.

Si resolver el problema como se describe es demasiado difícil, agradecería una sugerencia de una idea más pragmática. Si todo lo demás falla, siempre podría hacer algo por donde pasa en orden de prioridad, representa cada elemento en el lugar deseado si puede, si no, entonces intenta cambiarlo verticalmente, si aún no lo hace, horizontalmente hasta el límite permitido, antes de pasar al siguiente. El orden de prioridad significaría que probablemente se encontraría una solución subóptima, pero se ponderaría hacia los elementos más importantes. @

Respuestas a la pregunta(1)

Su respuesta a la pregunta