Go Down

Topic: [RISOLTO]Creare Matrici di bit x Immagini B/W (Read 14845 times) previous topic - next topic

Deltoz

Mar 07, 2014, 12:41 pm Last Edit: Mar 11, 2014, 01:43 am by Deltoz Reason: 1
Ho la necessita' di creare una matrice di valori booleani e possibilmente costanti facilmente interrogabile.
Quale e' la strada piu' semplice?
Avevo pensato di usare la funzione String, pero' vorrei trovare una soluzione migliore e meno dispendiosa.
Vorrei fare una matrice 100x100 e se utilizzassi la funzione String con valori booleano occuperei 10Kb di memoria.
Invece io vorrei sfruttare bit per bit (quindi 0 o 1)  diminuendo la memoria usata a 1,2Kb.
in pratica la matrice dovrebbe essere tipo:
0,0,0,0,1,1,1,1,0,0,1.........
0,0,0,0,1,1,1,0,1,0,1.........
e cosi' via.....
cosa mi consigliate?

leo72

Puoi usare singoli byte. Così 100 celle diventano 100/8=12,50->13 celle
Per cui con 100*13=1300 byte memorizzi tutto.

Se come dici sono costanti, memorizzale in Flash con PROGMEM perché con 2 soli K di RAM se ci metti dentro 1,2K di dati l'hai già riempita  ;)

gpb01

#2
Mar 07, 2014, 12:55 pm Last Edit: Mar 07, 2014, 01:01 pm by gpb01 Reason: 1
Se ben capisco ti servono 100 bit x 100 bit da cui, arrotondando per eccesso, una matrice da 13 x 100 bytes in cui accedi ai singoli bit ;)

Mi sembra abbastanza semplice ... perché vuoi scomodare le String ?

Ti fai una piccola funzione che trasforma X e Y della matrice in X1, Y1 e Z dove X1 e Y1 sono la coordinata del byte e Z è, in quel byte, la posizione del bit ... dopo di che leggi/scrivi il singolo bit ...

Lettura e scrittura del singolo bit, se sai giocare con gli operatori OR ed AND è una "scheggia", altrimenti ci sono sempre le funzioni per manipolare i bit (vd. nel reference alla sezione Bits and Bytes) ;)

Guglielmo

@ Lock : Stessa idea, stesso momento ... :smiley-mr-green:
Search is Your friend ... or I am Your enemy !

gpb01


eh, le ho dovute usare per tenere traccia dei data_block liberi in un filesystem bislacco


Beh ... in generale, nella gestione dei filesystems ... le bitmap sono all'ordine del giorno  XD XD XD

Guglielmo
Search is Your friend ... or I am Your enemy !

Deltoz

#4
Mar 07, 2014, 01:10 pm Last Edit: Mar 07, 2014, 01:15 pm by Deltoz Reason: 1
ok, aggiungo pero' qualche dettagli cosi' mi indirizzate meglio sulla strada da percorrere.
Per il discorso memoria uso il 1284P che ne ha abbastanza.
Io ho bisogno di velocita' di lettura (x confronto ed eventuale funzione di richiamo), quindi potrei optare per l' uso degli operatori OR, AND ecc, pero' credo di aver capito da come dice Lock che questo utilizzo mi fa perdere velocita'....

Edit: la lettura in flash e' piu' veloce o lenta della lettura in ram? credo piu' lenta giusto?

Deltoz

#5
Mar 07, 2014, 01:17 pm Last Edit: Mar 07, 2014, 02:13 pm by Deltoz Reason: 1
Edit...

Deltoz

ho buttato giu' qualcosa al volo.
che ve ne pare?
e' ottimizzabile in termini di velocita' di lettura?
Code: [Select]
boolean matrici(byte x,byte y){  //funzione che da come risultato il valore del bit alle coordinate x,y
  boolean risultato;
  byte matrice[13][100];         //matrice da creare nell' assegnazione delle costanti e variabili
  byte val,xmat,xrest;
  xmat=x/8;                   
  val=matrice[xmat][y];             //mi restituisce il byte che contiene il bit richiesto
  xrest=x%xmat;                //numero del bit da leggere nel byte
  risultato=bitRead(val,xrest);     
  return risultato;
}

andrea86


Deltoz


x iscrizione

non l' ho mai capito e approfitto per chiedere....
ma che significa : x iscrizione!! ??  :smiley-roll:

leo72

E' utile a chi frequenta il forum saltuariamente, così se magari la discussione è andata in 2a o 3a pagina rischi di perdertela, così invece hai l'elenco di quelle che ti interessano sotto "Unread replies".

Deltoz

oooo finalmente l' ho capito!  :D
Grazie...
Tra poco torno sull' argomento perché sto facendo mille prove.

Deltoz

bhe' no, non e' il cruscotto dello scooter, ma un progetto molto molto piu' complesso, che comprende tante funzioni tra cui la visualizzazione di manometri analogici.
A fine progetto vi mostrero' il tutto finito.
Comunque perdonami ma il tuo ultimo suggerimento non sono riuscito a svilupparlo, perché fai riferimento probabilmente a funzioni del C++ (o altro linguaggio) che nell' ide di arduino (per ora conosco solo quello) non corrispondono....
Per ora sto lavorando con un array bidimenzionale ""const byte matrice[100][13]{....."" con la quale sembra che ci sto riuscendo.
Quando ho finito posto tutta la funzione cosi' mi dite se puo' essere ottimizzata.
Il difficile sara' inizializzare tutta la matrice la prima volta bit per bit per ottenere lo sfondo desiderato, ma poi ci arrivo, magari se c'e' qualche strumento da poter usare ditemelo, tipo ricavare la mappatura in bit di un' immagine di pari dimensioni, da un bitmap monocromatico o da un raster..booo
Altra domanda: ma per assegnare a tutta la matrice lo stesso valore si fa cosi? : const byte matrice[100][13]={0); ?



Deltoz

si si hai ragione, la logica l' avevo capita, ma poi non riuscivo a svilupparla con l' ide, soprattutto sulla creazione del mapper.
Lo so che l' ideale e' sganciarsi da arduino, ma per ora conosco bene quella e non ho tempo di studiarmi i comandi e le funzioni di altri linguaggi.
E' gia' tanto che dopo 20 anni mi sono rimesso a inciarmare nella programmazione (usavo il pascal).
Ripeto, la logica di sviluppo ce l' ho tutta, ma per ora resto ancorato ad arduino puramente per il fatto che non ho il tempo di "studiare". Ma prima o poi lo faro'!

Deltoz

Allora, ecco la funzione che ho creato. Gli passo le coordinate X e Y e la funzione mi dice se a quelle coordinate all' interno della matrice il pixel esiste o meno.
la matrice l' ho inizializzata (per ora vuota) cosi:
Code: [Select]
const byte matrice[100][13]={};
la funzione e' questa:
Code: [Select]
boolean matrici(byte y,byte x){  //funzione che da come risultato il valore del bit alle coordinate x,y
  boolean esiste;                      //per sapere se il pixel e' gia' esistente True
  byte val,xmat,xrest;
        xmat=x/8;                      //mi restituisce in numero del byte nella riga               
        val=matrice[y][xmat];          //mi restituisce il byte che contiene il bit richiesto
        xrest=x%xmat;                  //numero del bit da leggere nel byte
        esiste=bitRead(val,xrest);     
        return esiste;
}

Come vi sembra? e' ottimizzabile?
la velocita' di rinfresco non e' male, per ora ho provato con singolo manometro, ma poi ne vorrei mettere almeno 4.

Deltoz

perfetto....quindi e' come ti dicevo..la logica era quella... poi come svilupparla varia dal linguaggio (e dalle mie poche capacita'..  XD).
Quindi ho seguito la strada migliore? meglio di cosi' non posso fare? (semre riferito all' IDE).
TNX

Go Up