Probablemente puedas diseñar algoritmos para hacer esto que sean variantes menores de una gama de algoritmos de generación de laberintos aleatorios. Sugeriré uno basado en el método union-find.
La idea básica en union-find es, dado un conjunto de elementos que se particiona en subconjuntos disjuntos (no superpuestos), identificar rápidamente a qué partición pertenece un elemento en particular. La "unión" combina dos conjuntos disjuntos para formar un conjunto más grande, el "buscar" determina a qué partición pertenece un miembro en particular. La idea es que cada partición del conjunto pueda ser identificada por un miembro particular del conjunto, de modo que pueda formar estructuras de árbol donde los punteros apuntan de miembro a miembro hacia la raíz. Puede unir dos particiones (dado un miembro arbitrario para cada una) encontrando primero la raíz para cada partición, luego modificando el puntero (previamente nulo) para que una raíz apunte a la otra.
Puede formular su problema como un problema de unión disjunta. Inicialmente, cada celda individual es una partición propia. Lo que quiere es fusionar particiones hasta que obtenga una pequeña cantidad de particiones (no necesariamente dos) de celdas conectadas. Luego, simplemente elige una (posiblemente la más grande) de las particiones y la dibuja.
Para cada celda, necesitará un puntero (inicialmente nulo) para la unión. Probablemente necesitará un vector de bits para actuar como un conjunto de celdas vecinas. Inicialmente, cada celda tendrá un conjunto de sus cuatro (u ocho) celdas adyacentes.
Para cada iteración, elige una celda al azar, luego sigue una cadena de punteros para encontrar su raíz. En los detalles de la raíz, encuentras sus vecinos establecidos. Elija un miembro aleatorio a partir de eso, luego encuentre la raíz para eso, para identificar una región vecina. Realice la unión (señale una raíz a la otra, etc.) para unir las dos regiones. Repita hasta que esté satisfecho con una de las regiones.
Al fusionar particiones, el nuevo conjunto vecino para la nueva raíz será la diferencia simétrica establecida (exclusiva o) de los conjuntos vecinos para las dos raíces anteriores.
Es probable que desee mantener otros datos a medida que vaya ampliando sus particiones, p. el tamaño - en cada elemento raíz. Puede usar esto para ser un poco más selectivo sobre seguir adelante con una unión en particular y ayudar a decidir cuándo detenerse. Alguna medida de la dispersión de las celdas en una partición puede ser relevante, por ej. una pequeña desviación o desviación estándar (en relación con un recuento de células grandes) probablemente indica una mancha densamente circular.
Cuando termine, simplemente escanee todas las celdas para probar si cada una es parte de la partición elegida para construir un mapa de bits separado.
En este enfoque, cuando elige al azar una celda al comienzo de una iteración, hay un fuerte sesgo hacia la elección de las particiones más grandes. Cuando elige un vecino, también hay un sesgo hacia la elección de una partición vecina más grande. Esto significa que usted tiende a obtener una mancha claramente dominante bastante rápido.
¿Qué restricciones tiene tu blob? Un programa que produce un píxel crea un blob de acuerdo con sus especificaciones, y de manera bastante eficiente. Si no dice lo que quiere, puede obtener respuestas que sean eficientes, satisfacer su pregunta como se le solicite y que no sea lo que desea. –
¡Bastante justo! ¿Dimensiones X e Y para el tamaño del cuadro delimitador, independientes entre sí, de 1 a 20? Puede aceptar suposiciones simplificadoras como "xey deben ser pares o impares". También para la densidad del blob sería genial poder decir que blob ocupa MIN% al MAX% del área delimitada, mejor si puedo decir oscurecer SPECIFICNUM de píxeles. Flexible en eso aunque – Nektarios
¿Puede haber "agujeros" en la burbuja? – luke