PDA

View Full Version : Programmino da creare con Processing!Bloccato


carlo.29
16-06-2017, 07:46
Ciao a tutti,
devo scrivere un programmino con processing ma mi sta facendo diventare matto.Mi blocco in un punto.

Il testo chiede di caricare un immagine da disco e creare un programma che abbia 2 modalità : mostra e modifica.In seguito alla pressione del tasto "m",il programma deve entrare in modalità "mostra" e visualizzare semplicemente l'immagine caricata (e sono riuscito a farlo).Premendo per la seconda volta il tasto "m",il programma entra in modalità "modifica".Deve suddividere l'immagine in 2 bande verticali.La divisione parte dal pixel mouseX-5,Y (Y,di logica, sarà uguale a quella del mouse,mouseY).
La funzione creaImmagine() avrà una variabile locale color c che leggerà il pixel in esame e lo trasferirà in due funzioni,bandadestra() e bandasinistra(),che riceveranno entrambe in input una variabile locale color,estrarranno le tonalità RGB del pixel in esame, e le altereranno in due modi diversi.Uno da applicare alla banda destra e l'altro alla banda sinistra.Quindi,restituiranno entrambe i colori modificati,che verranno richiamati in creaimmagine().Alla banda sinistra verrà applicato il colore modificato da bandasinistra(),alla banda destra il colore di bandadestra().
Successivamente,bisognerà richiamare creaImmagine() nella funzione predefinita draw(),che riceverà l'immagine,precedentemente caricata da disco, modificata da creaimmagine() e si comporterà nei modi elencati sopra alla pressione del tasto "m".
L'effetto da creare è ovviamente che, al movimento infinito del mouse,l'immagine sarà sempre divisa in 2 bande verticali colorate in base a qual'è il pixel mouseX-5,che cambia in continuazione, e le bande possono ovviamente restringersi e allargarsi.per esempio se sposto il mouse verso sinistra,sarà più grande quella di destra e viceversa.

Ho creato tutto il codice riguardante il caricamento dell'immagine da disco,setup,draw e le due funzioni bandasinistra() e bandadestra().
Mi blocco nella funzione creaimmagine().Non riesco a dividere l'immagine in due e colorare.Suppongo si possa fare con dei cicli FOR nidificati,che controllino le coordinate di x e di y di entrambe le bande.Però non ci capisco più nulla.Non capisco se tutto dipende da una sola x e y,del punto in esame,o le bande abbiano entrambe le loro coordinate.Non capisco nemmeno come richiamare le due funzioni e colorare due intere bande in base al movimento del mouse.
Per ora,dopo giorni di tentativi,visualizzo una sola banda,e non a colore fisso.Sposto il mouse e lampeggia di continuo.
Se inserisco le coordinate per la seconda banda,il programma non restituisce errore ma non visualizzo più nulla.

Potete darmi una mano con i cicli? :muro: :muro: :muro: :muro:

P.S. Il testo dell'esercizio dice che addirittura si potrebbero colorare le due bande attraverso una sola funzione,che applichi ad ogni banda la sua alterazione di colore ma non ho capito come si fa.Quindi ho creato due funzioni separate.

carlo.29
16-06-2017, 13:02
Non volevo allargare troppo il post precedente.
Escludendo la procedura per caricare l'immagine da disco,che mi funziona,inserisco le due funzioni e i cicli che sto provando a fare e non funzionano.Ci deve essere un casino enorme con le variabili e le coordinate.
Impostato così,mi colora solo la parte a sinistra del mouse ma il colore non è fisso.Lampeggia durante lo spostamento.A destra non colora nulla.
Come vedete,ho disattivato dei comandi.Se li attivo,non funziona nulla nemmeno a sinistra.

Codice :



PImage img,img1;


void setup()
{
surface.setResizable(true);
img= getImage();
surface.setSize(img.width, img.height);

image(img,0,0);

}


void draw()
{
if (key=='m')
{
noStroke();
image(img,0,0);
}
else if (key=='g')
{

img1=creaimmagine(img);
noStroke();
image(img1,0,0);

}

}


PImage creaimmagine(PImage img1)


{
int x0;int y0;int x1;int y1;int n_x=img.width;int n_y=img.height;
color c,csx,cdx;
c=img1.get(mouseX-5,mouseY);

for(x0=0;x0<=mouseX-5;x0=x0+1)
{
for(y0=0;y0<=mouseX-5+n_y-1;y0=y0+1)
{
//for(x1=mouseX-4;x1>n_x-mouseX-5;x1=x1+1)
//{
//for(y1=0;y1>=mouseX-4+n_y-1;y1=y1+1)
//{
c=img1.get(mouseX-5,mouseY);
csx=calcolapixelsx(c);
//cdx=calcolapixeldx(c);
img1.set(x0,y0,csx);
//img1.set(x1,y1,cdx);
//}
//}
}
}
return img1;
}

color calcolapixelsx(color csx)
{
float r,g,b;

r=red(csx);
g=green(csx);
b=blue(csx);


if(((r*1.5)+10.0)>255.0)
{
r=255.0;
}
else
{
r=(r*1.5)+10.0;
}

if(((g*1.3)+20.0)>255.0)
{
g=255.0;
}
else
{
g=(g*1.3)+20.0;
}

if((b+50.0)>255.0)
{
b=255.0;
}
else
{
b=b+50.0;
}


csx=color(r,g,b);

return csx;
}




color calcolapixeldx(color cdx)
{
float r,g,b;
float d;
d=sqrt(((mouseX-mouseX-5)*(mouseX-mouseX-5))+((mouseY-mouseY)*(mouseY-mouseY)));

r=red(cdx);
g=green(cdx);
b=blue(cdx);

if((r-d)>255.0)
{
r=255.0;
}
else
{
r=r-d;
}

if((g-d)>255.0)
{
g=255.0;
}
else
{
g=g-d;
}

if((b-d)>255.0)
{
b=255.0;
}
else
{
b=b-d;
}



cdx=color(r,g,b);

return cdx;
}