Tengo una vista (grande) de desplazamiento horizontal 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).Diseñar rectángulos evitando colisiones (ayuda con el algoritmo)
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 que solo pueden alejar K píxeles de su ideal horizontalmente, probablemente no todos los rectángulos podrán dibujarse. Para hacer frente a 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 decir cuál de los dos rectángulos tiene la prioridad más alta).
Estoy buscando algo del algoritmo conceptual, pero si necesita detalles, esto se ejecutará en un iPad, y habrá algunos miles (> 1000 pero < 10,000) rectángulos a considerar. Idealmente, me gustaría algo lo suficientemente rápido como para volver a ejecutar 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 sucedió el evento. Voy a aproximarme para obtener más de ellos.
He visto algoritmos como this, que hacen el truco de no intersección, pero no tienen la misma idea sobre cada elemento que 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, me gustaría recibir una sugerencia de una idea más pragmática. Si todo lo demás falla, siempre podría hacer algo en orden de prioridad, renderizar cada elemento en el lugar deseado si puede, si no, intenta desplazarlo verticalmente, si aún no lo hace, desplazarlo 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 la consideraría como la más importante.
Una o dos imágenes mejorarían esta pregunta. –
Imagen creada. Lo siento es tan difícil de describir :) –