Probabilmente potresti progettare algoritmi per fare questo che sono varianti minori di una serie di algoritmi casuali di generazione di labirinti. Ne suggerirò uno basato sul metodo union-find.
L'idea di base in unione-trova è, dato un insieme di elementi che è partizionato in sottoinsiemi disgiunti (non sovrapposti), per identificare rapidamente a quale partizione appartiene un particolare oggetto. La "unione" sta combinando insieme due insiemi disgiunti per formare un insieme più grande, il "ritrovamento" sta determinando a quale partizione appartiene un particolare membro. L'idea è che ogni partizione dell'insieme può essere identificata da un particolare membro del set, in modo da poter formare strutture ad albero in cui i puntatori puntano da un membro all'altro verso la radice. È possibile unire due partizioni (dato un membro arbitrario per ciascuna) individuando prima la radice per ogni partizione, quindi modificando il puntatore (precedentemente null) per una radice in modo che punti all'altro.
È possibile formulare il problema come un problema sindacale disgiunto. Inizialmente, ogni singola cella è una partizione a sé stante. Quello che vuoi è unire le partizioni fino a ottenere un piccolo numero di partizioni (non necessariamente due) di celle connesse. Quindi, devi semplicemente scegliere uno (possibilmente il più grande) delle partizioni e disegnarlo.
Per ogni cella, è necessario un puntatore (inizialmente nullo) per l'unione. Probabilmente avrai bisogno di un vettore bit per agire come un insieme di celle vicine. Inizialmente, ogni cella avrà un insieme delle sue quattro (o otto) celle adiacenti.
Per ogni iterazione, si sceglie una cella a caso, quindi si segue una catena di puntatori per trovare la sua radice. Nei dettagli dalla radice, trovi i suoi vicini impostati. Scegli un membro a caso da quello, quindi trova la radice per quello, per identificare una regione vicina. Esegui l'unione (punta una radice all'altra, ecc.) Per unire le due regioni. Ripeti finché non sei soddisfatto di una delle regioni.
Quando si uniscono le partizioni, il nuovo insieme di vicini per la nuova radice sarà la differenza simmetrica impostata (esclusiva o) degli insiemi vicini per le due radici precedenti.
Probabilmente vorrai mantenere altri dati man mano che cresci le tue partizioni - ad es. la dimensione - in ogni elemento radice. Puoi usare questo per essere un po 'più selettivo sull'andare avanti con un particolare sindacato e per aiutare a decidere quando fermarti. Una certa misura della dispersione delle celle in una partizione può essere rilevante - ad es. una piccola deviazione o deviazione standard (relativa a un numero elevato di cellule) probabilmente indica un denso blob approssimativamente circolare.
Al termine, è sufficiente eseguire la scansione di tutte le celle per verificare se ciascuna è una parte della partizione scelta per creare una bitmap separata.
In questo approccio, quando si sceglie casualmente una cella all'inizio di un'iterazione, c'è un forte pregiudizio verso la scelta delle partizioni più grandi. Quando si sceglie un vicino, c'è anche un pregiudizio verso la scelta di una partizione vicina più grande. Ciò significa che tendi a ottenere un blob chiaramente dominante piuttosto rapidamente.
Quali vincoli sul blob? Un programma che produce un pixel sta creando un blob in base alle specifiche e in modo abbastanza efficiente. Se non dici quello che vuoi, puoi ottenere risposte efficienti, soddisfare la tua domanda come richiesto e non è quello che vuoi. –
Abbastanza giusto! Le dimensioni X e Y indicate per le dimensioni del riquadro di delimitazione, indipendenti l'una dall'altra, da 1 a 20? Può accettare ipotesi semplificative come "xey deve essere pari o dispari". Inoltre, per la densità del blob sarebbe bello poter dire che BLOB occupa MIN% al MAX% dell'area di delimitazione, meglio se posso dire scurire SPECIFICNUM dei pixel. Flessibile su quello anche se – Nektarios
Ci possono essere "buchi" nel BLOB? – luke