Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Graph- colore
Forum - Pascal - Graph- colore

Avatar
dario cavarrett (Normal User)
Newbie


Messaggi: 10
Iscritto: 05/02/2017

Segnala al moderatore
Postato alle 17:05
Venerdì, 10/02/2017
Salve mi servirebbe un consiglio per un problema che probabilmente, in realtà, é molto semplice: io ho una figura che si muove (in graph) a seconda dei comandi inseriti in input dall' utente, la domanda é: one faccio a comprarla in modo che rimanga colorata in ogni posizione (usando floodfill la rivolta ad ogni spostamento e ovviamente non é un Bell effetto)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:33
Venerdì, 10/02/2017
Se floodfill impiega troppo tempo "lenta", puoi utilizzare la funzione GetImage, come precedentemente suggerito.
Posta il programma per avere maggiori dettagli sul problema.

PM Quote
Avatar
dario cavarrett (Normal User)
Newbie


Messaggi: 10
Iscritto: 05/02/2017

Segnala al moderatore
Postato alle 20:25
Venerdì, 10/02/2017
Program esempio;

Uses graph,wincrt;

Procedure disegno(x,y:integer);
Begin
Circle(x,y,13);
End;
Var ch:char;
,x,y:integer;
Begin
//inizializzo la grafica
X:=400;
Y=300;
Repeat
If keypressed the
Ch:=reakey;
Case ch of
1:begin
x:=x;
Y:=y-10;
Disegno(x,y);
End;
End;

  
Until 1=2

End.
//l ho scritto veloce ed esemplificato solo per risparmiare tempo: questo è il concetto comunque

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 23:13
Venerdì, 10/02/2017
Ho rivisto il programma:
Codice sorgente - presumibilmente Delphi

  1. Uses graph, crt;
  2.  
  3. function inizio_graf:boolean;
  4. var sg,ng:integer;
  5. begin
  6.  sg:=detect; ng:=0;
  7.  initgraph(sg, ng, '');
  8.  inizio_graf:=graphresult = grOk;
  9. end;
  10.  
  11. Procedure disegno(x,y:integer); // Disegna la figura a video
  12. Begin
  13.     setColor(green);
  14.     Circle(x,y,13);
  15.     setFillStyle(1, red);
  16.     floodFill(x, y, green);
  17. End;
  18.  
  19.  
  20. procedure inizio(var immagine,vuoto:pointer); // Memorizza le fugure in immagine e vuoto
  21. var dimensione:word;
  22. begin
  23.         clearDevice; // pulizia del video
  24.         dimensione:=imageSize(0,0, 26,26); // Calcolo della memoria necessaria a memorizzare le figure
  25.         getMem(immagine, dimensione); // allocazione della memoria per immagine
  26.         getMem(vuoto, dimensione); // allocazione della memoria per vuoto
  27.         getImage(0,0, 26,26, vuoto^); // in vuoto memorizzo un rettangolo nero
  28.     disegno(13, 13);
  29.     getImage(0,0, 26,26, immagine^); // in immagine memorizzo il disegno
  30.     putImage(0, 0, vuoto^, normalPut); // in vuoto, è memorizzato un quadrato nero,
  31.                                        // quindi con questa istruzione pulisco lo schermo.
  32. end;
  33.  
  34. procedure immagine(x,y:integer; figura:pointer);
  35. begin
  36.    putImage(x, y, figura^, normalPut); // Genere l'immagine memorizzata in figura
  37.    // putImage lavora tramite puntatori, di conseguenza figura va indicata con ^ finale.
  38. end;
  39.  
  40. Var ch:char;
  41.     x,y:integer;
  42.     palla,nero:pointer;
  43.  
  44.  
  45. Begin
  46.  
  47.         if inizio_graf then
  48.         begin
  49.                 X:=400;
  50.                 Y:=300;
  51.                 inizio(palla, nero);
  52.                 Repeat
  53.                         If keypressed then
  54.                         begin
  55.                                 Ch:=readkey;
  56.                                 if ch='w' then
  57.                                 begin
  58.                                     immagine(x, y, nero); // cancella la figura precedente
  59.                                         Y:=y - 20;
  60.                                         immagine(x, y, palla) // disegna l'immagine nella nuova posizione.
  61.                                 end;
  62.                                 if ch='s' then
  63.                                 begin
  64.                                     immagine(x, y, nero);
  65.                                         x:=x + 20;
  66.                                         immagine(x, y, palla);
  67.                                 end;
  68.                                 if ch='a' then
  69.                                 begin
  70.                                     immagine(x, y, nero);
  71.                                         x:=x - 20;
  72.                                         disegno(x+13, y+13); // Richiamo la procedura disegno
  73.                                                              // per un confronto con immagine.
  74.                                 end;
  75.                                 if ch='z' then
  76.                                 begin
  77.                                     immagine(x, y, nero);
  78.                                         y:=y + 20;
  79.                                         immagine(x, y, palla);
  80.                                 end;
  81.                         end;
  82.                 Until upCase(ch)='Q';
  83.             closegraph;
  84.             freeMem(palla);
  85.             freeMem(nero);
  86.             // Alla fine del programma è necessario deallocare
  87.             // la memoria in palla e nero tramite la funzione freeMem.
  88.         end;
  89. End.


PM Quote
Avatar
dario cavarrett (Normal User)
Newbie


Messaggi: 10
Iscritto: 05/02/2017

Segnala al moderatore
Postato alle 6:40
Sabato, 11/02/2017
Grazie veramente, sei stato molto d'aiuto

Ultima modifica effettuata da dario cavarrett il 11/02/2017 alle 6:41
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 9:52
Sabato, 11/02/2017
Di nulla.

PM Quote
Avatar
dario cavarrett (Normal User)
Newbie


Messaggi: 10
Iscritto: 05/02/2017

Segnala al moderatore
Postato alle 14:14
Sabato, 11/02/2017
scusa, copiaincollandolo tale e quale, ora, non capisco perché non funzioni: il cerchio appare per un secondo e poi scompare.

PM Quote
Avatar
dario cavarrett (Normal User)
Newbie


Messaggi: 10
Iscritto: 05/02/2017

Segnala al moderatore
Postato alle 14:19
Sabato, 11/02/2017
No niente ho risolto; avevo utilizzato crt invece che wincrt.
Comunque ho ancora una domanda: come mai facendolo andare verso sinistra ci mette più tempo a caricare?

Ultima modifica effettuata da dario cavarrett il 11/02/2017 alle 14:21
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:15
Sabato, 11/02/2017
Per lo spostamento a sinistra il programma genera la figura direttamente tramite la procedura disegno, - vedi la riga 72 -  mentre per gli altri spostamenti, si ha semplicemente una sovrapposizione di un immagine registrata in memoria. Ho volutamente differenziato la rappresentazione della figura per confrontarle.

PM Quote