Nokioteca [Nokia] Forum: Algoritmo Per Colorare Un'area Ben Definita - Nokioteca [Nokia] Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

Algoritmo Per Colorare Un'area Ben Definita ...senza ricorsione...

#1 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 16 agosto 2009 - 11:29

Sto lavorando a un programma per disegnare sul cellulare, ed essendo già a buon punto dovrei creare il tool per riempire un'area delimitata da un contorno...
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?
0

#2 L   pandipo 

  • Millennium Member
  • PuntoPuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 1159
  • Iscritto: 18 maggio 2007
  • Località:spinea VE
  • Cellulare:n79

Inviato 16 agosto 2009 - 12:00

imagedesiner ha questa funzione :shifty:
in pys60
0

#3 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 17 agosto 2009 - 09:53

Si ma per quel che mi risulti i 2nd edition hanno uno schermo più piccolo ;) quindi è normale che richiedano meno risorse di un 640x360...
Ho trovato un altro algoritmo ma la quantità di memoria utilizzata è sempre troppo elevata...
sigh...
0

#4 L   Il.Socio 

  • Nokioteca Staff
  • Gruppo: Moderatore
  • Messaggi: 7144
  • Iscritto: 02 dicembre 2005
  • Località:Torino
  • Cellulare:N8-00

Inviato 17 agosto 2009 - 09:55

Male che vada, puoi trasformare l'algoritmo ricorsivo che stai utilizzando, in forma iterativa, appoggiandoti ad una pila (aka stack).

Messaggio modificato da Il.Socio il 17 agosto 2009 - 14:12

Per segnalare allo Staff un messaggio non conforme al regolamento è sufficiente premere il bottone "Segnala" posizionato in basso a sinistra di ciascun messaggio.
0

#5 L   memoryn70 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 2112
  • Iscritto: 02 maggio 2007
  • Cellulare:Nokia N70
  • Firmware:5.0609.2.0.1

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...
0

#6 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 17 agosto 2009 - 21:00

@ Socio:
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)...
0

#7 L   Il.Socio 

  • Nokioteca Staff
  • Gruppo: Moderatore
  • Messaggi: 7144
  • Iscritto: 02 dicembre 2005
  • Località:Torino
  • Cellulare:N8-00

Inviato 17 agosto 2009 - 22:36

Visualizza Messaggimasmil1988, il 17/08/2009 - 22:00, ha scritto:

@ Socio:
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

0

#8 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 18 agosto 2009 - 19:01

Questa di utilizzare un file potrebbe essere una soluzione, e a questa non avevo pensato... Mi metto all'opera :-) speriamo bene! Grazie!
0

#9 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 20 agosto 2009 - 11:59

Ho modificato un po' il programma utilizzando i file come suggerito e ora il problema del riempimento col metodo ricorsivo non crea problemi, finquando l'area da colorare non è troppo estesa...
Pensi che con la pila vengano usate meno risorse rispetto alla ricorsione?
0

#10 L   dany88 

  • Millennium Member
  • PuntoPuntoPuntoPuntoPuntoPuntoPunto
  • Gruppo: Utente
  • Messaggi: 1185
  • Iscritto: 09 dicembre 2006

Inviato 20 agosto 2009 - 12:24

sicuramente, con il metodo iterativo non c'è da riempire lo stack, al contrario di quello che avviene per ogni chiamata ricorsiva.

Messaggio modificato da dany88 il 20 agosto 2009 - 12:24

0

#11 L   Il.Socio 

  • Nokioteca Staff
  • Gruppo: Moderatore
  • Messaggi: 7144
  • Iscritto: 02 dicembre 2005
  • Località:Torino
  • Cellulare:N8-00

Inviato 20 agosto 2009 - 16:56

Visualizza Messaggimasmil1988, il 20/08/2009 - 12:59, ha scritto:

Pensi che con la pila vengano usate meno risorse rispetto alla ricorsione?

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! :mumble:

Link per un piccolo ripasso... :)
Per visualizzare questo link registrati o esegui il log in.

Messaggio modificato da Il.Socio il 19 settembre 2009 - 17:45

0

#12 L   masmil1988 

  • Millennium Member
  • Gruppo: Developer
  • Messaggi: 1576
  • Iscritto: 03 dicembre 2005
  • Località:Alcamo (TP)
  • Cellulare:Nokia 5800
  • Firmware:51.0.006

Inviato 20 agosto 2009 - 18:16

Perdonate l'ignoranza a riguardo ma sono cose che toccheremo fortemente quest'anno (terzo anno) e che abbiamo appena guardato in questi due anni... inoltre è la prima volta che ho a che fare con problemi di memoria :D
Vi ringrazio comunque!
Comprendo benissimo e vado avanti nel lavoro ;-)

Messaggio modificato da masmil1988 il 20 agosto 2009 - 18:17

0

Condividi questa discussione:


Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione