-
per sessuofonoil compito era una merda e lo sapevi già, però ho provato a farlo "bene", anche se c'erano pochi margini. A dire il vero potevo usare una variabile in meno nello scorrere l'array, ma ho privilegiato la leggibilità.
Tutto sommato però mi sembra sempre una merda.
Tu cosa ne pensi?
Testo della traccia:
Esercizio:
State lavorando al progetto di un applicativo per la gestione di immagini e, in particolare, per la
creazione di filtri che distorcano immagini memorizzate mediante la codifica bitmap con una
profondità di colore di 16 bit.
La codifica bitmap prevede che ogni pixel venga rappresentato da un valore intero (in questo caso
da 0 a 65.535) che rappresenta la sfumatura di colore.
Vi viene richiesto di realizzare una funzione, in linguaggio C++, che realizzi il filtraggio. Tale
funzione riceve in ingresso una matrice di NxM numeri interi e crea una nuova matrice modificando
i valori secondo il seguente criterio: il valore di coordinate (i,j) viene sostituito con la media dei
valori della sottomatrice con elemento superiore sinistro di coordinate (i-2, j-2) ed elemento
inferiore destro di coordinate (i+2, j+2). Chiaramente si deve considerare solo la somma degli
elementi esistenti e quindi vanno considerati con attenzione i casi in cui i e j identifichino degli
elementi vicini al contorno della matrice.
Si realizzi anche un semplice main() per testare il corretto funzionamento della funzione prodotta.#include <iostream> #include <iomanip> using namespace std; // Dichiarazione delle costanti const int RIG = 14; //righe matrice const int COL = 7; //colonne matrice int stampaMat(int mat[][COL], int rig); int filtro(int img_in[][COL], int img_out[][COL], int rig); int main() { int image[RIG][COL]={ {11900, 11987, 11934, 11999, 12036, 12087, 12100}, {11992, 12003, 11953, 12015, 12098, 12107, 12110}, {12000, 12008, 12023, 12111, 12120, 12128, 12120}, {12066, 12025, 12099, 12145, 12135, 12099, 12099}, {12059, 12087, 12089, 12136, 12130, 12110, 12101}, {12050, 12100, 12098, 12150, 12155, 12123, 12097}, {1255, 12306, 12287, 12256, 12244, 12249, 12200}, {11900, 11987, 11934, 11999, 12036, 12087, 12100}, {11992, 12003, 11953, 12015, 12098, 12107, 12110}, {12000, 12008, 12023, 12111, 12120, 12128, 12120}, {12066, 12025, 12099, 12145, 12135, 12099, 12099}, {12059, 12087, 12089, 12136, 12130, 12110, 12101}, {12050, 12100, 12098, 12150, 12155, 12123, 12097}, {1255, 12306, 12287, 12256, 12244, 12249, 12200}, }; int img_new[RIG][COL]; stampaMat(image,RIG); cout << "\n"; filtro(image,img_new,RIG); stampaMat(img_new,RIG); cout << "\n"; return 0; } int stampaMat(int mat[][COL], int rig) { for(int i=0;i<rig;i++) { for(int j=0;j<COL;j++) cout << setw(6) << mat[i][j]; cout << "\n"; } return 0; } int filtro(int img_in[][COL], int img_out[][COL], int rig) { for(int i=0;i<rig;i++) { int lim_inf_r, lim_sup_r; //calcolo dell'indice delle righe della sottomatrice if (i-2<0) //se l'elemento è "troppo in alto" { lim_inf_r=0; lim_sup_r=i+2; } else if (i+2>=rig) //se l'elemento è "troppo in basso" { lim_sup_r=rig-1; lim_inf_r=i-2; } else //se l'elemento è al centro { lim_inf_r=i-2; lim_sup_r=i+2; } for(int j=0;j<COL;j++) { int lim_inf_c, lim_sup_c; long subtotale=0; //per sommare dei numeri grandi, ci vuole una variabile grande int n_elementi; //calcolo dell'indice delle colonne della sottomatrice if (j-2<0) //elemento di estrema destra { lim_inf_c=0; lim_sup_c=j+2; } else if (j+2>=COL ) //elemento di estrema sinistra { lim_sup_c=COL-1; lim_inf_c=j-2; } else //elemento di estremo centro<IMG SRC="images/emo/1.gif" border="0" height="20" alt="Sorride" title="Sorride">) { lim_inf_c=j-2; lim_sup_c=j+2; } //Ora che si sono calcolati gli estremi, si calcola la media della sottomatrice for (int sub_r=lim_inf_r; sub_r<=lim_sup_r; sub_r++) for (int sub_c=lim_inf_c; sub_c<=lim_sup_c; sub_c++) subtotale+=img_in[sub_r][sub_c]; n_elementi=(lim_sup_r-lim_inf_r+1)*(lim_sup_c-lim_inf_c+1); img_out[i][j]=subtotale/n_elementi; } } return 0; }-
Re: per sessuofonoScritto daavvelentaniCubicolarioil 2010-11-15 22:03:00.0 alle 2010-11-15 22:03:00.0Trollate totali: 18184Mi sembra giusta, ma io la scriverei cosi`:
#include <algorithm> using namespace std; int filtro(int img_in[][COL], int img_out[][COL], int rig) { for(int i=0;i<rig;i++) { int lim_inf_r = max(0, i-2), lim_sup_r = min(rig-1, i+2); for(int j=0;j<COL;j++) { int lim_inf_c = max(0, j-2), lim_sup_c = min(COL-1, j+2); long subtotale=0; //per sommare dei numeri grandi, ci vuole una variabile grande int n_elementi; //Ora che si sono calcolati gli estremi, si calcola la media della sottomatrice for (int sub_r=lim_inf_r; sub_r<=lim_sup_r; sub_r++) for (int sub_c=lim_inf_c; sub_c<=lim_sup_c; sub_c++) subtotale+=img_in[sub_r][sub_c]; n_elementi=(lim_sup_r-lim_inf_r+1)*(lim_sup_c-lim_inf_c+1); img_out[i][j]=subtotale/n_elementi; } } return 0; }I think happiness is love
- Vladimir Putin-
Re: per sessuofono
- Scritto da: avvelentani
> Mi sembra giusta, ma io la scriverei cosi`:
>
>> #include <algorithm> > > using namespace std; > > int filtro(int img_in[][COL], int img_out[][COL], > int > rig) > { > for(int i=0;i<rig;i++) > { > int lim_inf_r = max(0, i-2), lim_sup_r = > min(rig-1, > i+2); > for(int j=0;j<COL;j++) { > int lim_inf_c = max(0, j-2), lim_sup_c = > min(COL-1, > j+2); > long subtotale=0; //per sommare dei numeri > grandi, ci vuole una variabile > grande > int n_elementi; > > //Ora che si sono calcolati gli estremi, si > calcola la media della > sottomatrice > for (int sub_r=lim_inf_r; sub_r<=lim_sup_r; > sub_r++) > for (int sub_c=lim_inf_c; sub_c<=lim_sup_c; > sub_c++) > subtotale+=img_in[sub_r][sub_c]; > > n_elementi=(lim_sup_r-lim_inf_r+1)*(lim_sup_c-lim > img_out[i][j]=subtotale/n_elementi; > } > } > return 0; > } > >
beh sì, a conoscere tutte le librerie... comunque, come sono implementate le funzioni min e max?
dubito esistano molti algoritmi a riguardo...-
Re: per sessuofonoScritto daNon Autenticatoil 2010-11-15 23:10:00.0 alle 2010-11-15 23:10:00.0- Scritto da: Caccola
>
> - Scritto da: avvelentani
> > Mi sembra giusta, ma io la scriverei cosi`:
> >
> >> > #include <algorithm> > > > > using namespace std; > > > > int filtro(int img_in[][COL], int
> img_out[][COL], > > int > > rig) > > { > > for(int i=0;i<rig;i++) > > { > > int lim_inf_r = max(0, i-2), lim_sup_r = > > min(rig-1, > > i+2); > > for(int j=0;j<COL;j++) { > > int lim_inf_c = max(0, j-2), lim_sup_c = > > min(COL-1, > > j+2); > > long subtotale=0; //per sommare dei numeri > > grandi, ci vuole una variabile > > grande > > int n_elementi; > > > > //Ora che si sono calcolati gli estremi, si > > calcola la media della > > sottomatrice > > for (int sub_r=lim_inf_r; sub_r<=lim_sup_r; > > sub_r++) > > for (int sub_c=lim_inf_c; sub_c<=lim_sup_c; > > sub_c++) > > subtotale+=img_in[sub_r][sub_c]; > > > > > n_elementi=(lim_sup_r-lim_inf_r+1)*(lim_sup_c-lim > > img_out[i][j]=subtotale/n_elementi; > > } > > } > > return 0; > > } > > > >
>
> beh sì, a conoscere tutte le librerie...
${rosik}
-
Re: per sessuofonoScritto daavvelentaniCubicolarioil 2010-11-15 23:24:00.0 alle 2010-11-15 23:24:00.0Trollate totali: 18184
- Scritto da: Caccola
> beh sì, a conoscere tutte le librerie...
> comunque, come sono implementate le funzioni min
> e
> max?
> dubito esistano molti algoritmi a riguardo...
Sono implementate con polvere di fata.I think happiness is love
- Vladimir Putin-
Re: per sessuofonoScritto daNon Autenticatoil 2010-11-15 23:34:00.0 alle 2010-11-15 23:34:00.0- Scritto da: avvelentani
>
> - Scritto da: Caccola
> > beh sì, a conoscere tutte le librerie...
> > comunque, come sono implementate le funzioni min
> > e
> > max?
> > dubito esistano molti algoritmi a riguardo...
>
> Sono implementate con polvere di fata.
-
-
-
-
Re: per sessuofono
- Scritto da: Caccola
>> //se l'elemento è "troppo in alto" > //se l'elemento è "troppo in basso"
Giambo avrebbe usato il MOD
Per gli elementi di estrema destra e estrema sinistra, avrebbe usato uno stivale chiodato
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
-
Re: per sessuofono
- Scritto da: Caccola
> > Giambo avrebbe usato il MOD
> > Per gli elementi di estrema destra e estrema
> > sinistra, avrebbe usato uno stivale chiodato
> >
>
> giusto, non m'è venuto in mente.
Chi andiamo a trollare oggi
?
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo
-
-
Re: per sessuofonoScritto daavvelentaniCubicolarioil 2010-11-16 14:27:00.0 alle 2010-11-16 14:27:00.0Trollate totali: 18184
- Scritto da: Giambo
>
> - Scritto da: Caccola
>
> >> > //se l'elemento è "troppo in alto" > > //se l'elemento è "troppo in basso"
>
>
> Giambo avrebbe usato il MOD
Non e` toroidale.I think happiness is love
- Vladimir Putin-
Re: per sessuofonoScritto daNon Autenticatoil 2010-11-16 14:40:00.0 alle 2010-11-16 14:40:00.0- Scritto da: avvelentani
>
> - Scritto da: Giambo
> >
> > - Scritto da: Caccola
> >
> > >> > > //se l'elemento è "troppo in alto" > > > //se l'elemento è "troppo in basso"
> >
> >
> > Giambo avrebbe usato il MOD
>
> Non e` toroidale.
Oggi Giambo non è in vene, fa anche le battute che non fanno ridere...
-
Re: per sessuofono
- Scritto da: avvelentani
> > >> > > //se l'elemento è "troppo in alto" > > > //se l'elemento è "troppo in basso"
> >
> >
> > Giambo avrebbe usato il MOD
>
> Non e` toroidale.
Irrilevante.
Si, OK, ho detto una mezza cazzata, pero' se insisti posso ancora salvarmi
!
`"la realta' non e' cosi' terrificante come vogliono farti credere" - Giambo ` - Wakko che cita Giambo-
Re: per sessuofonoScritto daavvelentaniCubicolarioil 2010-11-16 17:45:00.0 alle 2010-11-16 17:45:00.0Trollate totali: 18184Sono cose che capitano.I think happiness is love
- Vladimir Putin
-
-
-
-