Algoritmo Per Colorare Un'area Ben Definita ...senza ricorsione...
#1
Inviato 16 agosto 2009 - 11:29
Avevo pensato a un algoritmo ricorsivo che, partendo da un punto si espandesse colorando a poco a poco tutto intorno.
L'algoritmo funziona dal punto di vista teorico, ma dal punto di vista pratico richiede parecchia memoria e quindi il cellulare non è in grado di eseguirlo...
Questo è forse il perchè nessun programma di disegno per cellulare ha questa funzione...
Qualcuno conosce un algoritmo NON RICORSIVO che faccia la stessa cosa?
#3
Inviato 17 agosto 2009 - 09:53
Ho trovato un altro algoritmo ma la quantità di memoria utilizzata è sempre troppo elevata...
sigh...
#4
Inviato 17 agosto 2009 - 09:55
Messaggio modificato da Il.Socio il 17 agosto 2009 - 14:12
#5
Inviato 17 agosto 2009 - 10:41
pixel_coord=[] #Array che conterrà le coordinate di tutti i pixel for y in xrange(640): pixel_coord+=[(x,y) for x in xrange(360)] #Poi puoi fare colors=image.getpixel(pixel_coord) #...e avrai rgb di tutti i pixel #Puoi anche colorare tutti in un colpo facendo image.point(pixel_coord, fill=0)
Prova a vedere una cosa del genere...
#6
Inviato 17 agosto 2009 - 21:00
Ho provato anche con una pila, ma da sempre errore di memoria insufficiente, perchè purtroppo per poter avere la funzione che annulli l'ultima operazione effettuata devo memorizzare due immagini complete, per un totale di 600x360x2 pixel, e purtroppo mShell ha soltanto il tipo numerico, che alloca lo stesso spazio per ogni numero qualunque esso sia, anche se tutto questo spazio non serve...
@ Memory:
Io ho già i colori di ogni singolo pixel, ma se devo colorare un'area devo sapere quali pixel sono racchiusi in quell'area...
Credo che più che questo debba vedere come poter gestire in maniera più intelligente tutto il resto (se possibile)...
#7
Inviato 17 agosto 2009 - 22:36
masmil1988, il 17/08/2009 - 22:00, ha scritto:
Ho provato anche con una pila, ma da sempre errore di memoria insufficiente, perchè purtroppo per poter avere la funzione che annulli l'ultima operazione effettuata devo memorizzare due immagini complete, per un totale di 600x360x2 pixel, e purtroppo mShell ha soltanto il tipo numerico, che alloca lo stesso spazio per ogni numero qualunque esso sia, anche se tutto questo spazio non serve...
Questo e' un problema differente... Quindi ti trovi a dover fare i conti con 2 problemi di memoria!
Il primo problema, di stack overflow dell'algoritmo ricorsivo, lo risolvi usando una pila.
Per quel che riguarda il secondo problema di salvare tutti quei dati in memoria, puoi appoggiarti ad un file, cosi' da tenere in memoria sempre e solo 1 immagine e su file tieni il "backup" che ti serve per annullare l'operazione effettuata.
Eventualmente, il file lo puoi salvare nell'unita' D: (ammesso che sia possibile da mShell) cosi' facendo il file si trovera' comunque in RAM e l'accesso a quei dati sara' veloce.
Messaggio modificato da Il.Socio il 17 agosto 2009 - 22:37
#8
Inviato 18 agosto 2009 - 19:01
#9
Inviato 20 agosto 2009 - 11:59
Pensi che con la pila vengano usate meno risorse rispetto alla ricorsione?
#10
Inviato 20 agosto 2009 - 12:24
Messaggio modificato da dany88 il 20 agosto 2009 - 12:24
#11
Inviato 20 agosto 2009 - 16:56
masmil1988, il 20/08/2009 - 12:59, ha scritto:
Per la precisione, con la pila vengono usate nel complesso maggiori risorse rispetto alla ricorsione, ma la differenza fondamentale e' che la ricorsione utilizza fortemente lo stack (che e' molto piccolo), mentre gestendo "a manina" una pila si utilizza lo heap (che e' molto piu' grande).
Giusto per buttare giu' due numeri campati un "po' in aria" per esprimere il concetto...
Se un algoritmo ricorsivo ti porta via complessivamente 4kb di memoria (stack), un algoritmo iterativo ti portera' via complessivamente 5kb di memoria (di cui 50 byte di stack, ed il restante di heap) ---> quindi porta via + risorse.
Ma considera che, nei tuoi programmi, potresti avere a disposizione "solo" 5kb di stack, ma averne 30mb di heap! ---> quindi evita la ricorsione in questo caso e vai di pila!
Link per un piccolo ripasso...
Messaggio modificato da Il.Socio il 19 settembre 2009 - 17:45
#12
Inviato 20 agosto 2009 - 18:16
Vi ringrazio comunque!
Comprendo benissimo e vado avanti nel lavoro ;-)
Messaggio modificato da masmil1988 il 20 agosto 2009 - 18:17

Aiuto
















Pubblicità