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
Delphi - Disegnare funzioni temporizzate
Forum - Delphi - Disegnare funzioni temporizzate

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
rep87 (Normal User)
Newbie


Messaggi: 17
Iscritto: 27/12/2010

Segnala al moderatore
Postato alle 17:56
Mercoledì, 29/12/2010
Buongiorno ragazzi.

Nell'allegato vi è un unit di delphi che ho compilato per disegnare funzioni goniometriche.
Vorrei aggiungere un Radiogroup, collegata al TImer 1, che mi permetta di far decidere all'utente con quale velocità far disegnare al programma la funzione.
Ad esempio, farla disegnare istantanea, o al contrario molto lentamente, come se fosse fatta a mano.
Come posso fare? Un aiutino?
Grazie!


rep87 ha allegato un file: Programma.zip (20823 bytes)
Clicca qui per scaricare il file
PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 14:20
Giovedì, 30/12/2010
Ho capito...
Allora la mia proposta è questa: Tu hai un timer chiamato TTimerEngine. OK?
Le tre proprietà del timer che ti interessano sono:
Interval  (è l'intervallo periodico con cui funziona);
Enable (è una proprietà booleana: TRUE -> il timer funziona. FALSE -> il timer è fermo)
OnTimer (è un evento: è la procedura che ti interessa: tutto il codice scritto all'interno viene ripetuto a distanza temporale INTERVAL.

Metto un punto (A): fin qui tutto chiaro?

Dal codice che hai scritto, noto che tu disegni il seno in questo modo: poni innanzitutto il tuo asse X, e per ogni punto di questo, ti trovi il corrispettivo punto sull'asse Y. Sostanzialmente, il ciclo for non fa altro che associarti ad ogni X che va da un punto iniziale I ad un punto finale F, una coordinata Y = Sen(Xo). Avute le due coordinate le inserisci nella funzione PutPixels del Canvas e tutto risolto. Ora tutto questo viene svolto dal ciclo For ... To ... Do che ti esegue l'operazione di assegnamento diciamo "istantaneamente" (anche se è errato). Ora quello che serve a te è che ogni punto venga "trovato" e "disegnato" con una certa lentezza, e il timer è quello che ti serve:
IL CODICE CHE DEVE RIPETERE IL TIMER AD OGNI INTERVALLO E' L'ASSEGNAZIONE DI UNA Y DATO UN VALORE X.
Questo è il nodo centrale che devi TENERE SEMPRE PRESENTE.
Ora l'evento in cui metterai quel codice è ovviamente OnTimer.

Nella pratica cosa deve fare?

Devi scegliere anzitutto un intervallo X in cui disegnare la tua funzione. Inizio con gli esempi: Mettiamo tu debba disegnare la funzione da X=5 a X=1000.
Ora vogliamo fare in modo che per disegnar un intervallo di 995 punti (ci sei fin qui?), ci metta ad esempio 10 secondi. OK?
Quanto tempo allora deve metterci per disegnare ogni punto? Ci metterà esattamente INTERVALLO DI SPAZIO / INTERVALLO DI TEMPO.
Dunque la velocità con cui deve proseguire il timer, parlo dunque della proprietà INTERVAL, deve essere impostata come:
TTimerEngine.Interval = (Xf - Xi) div (1000 * T).
T è il tempo in secondi che abbiamo scelto (ricordo che il timer "legge" in millisecondi"), nel nostro caso 10*1000 = 10000ms. Xf è il punto X finale; nel nostro caso 1000. Xi è il punto iniziale; nel nostro caso 5;
L'espressione, nel nostro caso particolare diventa:
TTimer.Engine.Interval = (1000 - 5) div (1000 * 10);.

Una volta impostato l'intervallo del timer, dobbiamo "dargli in pasto" le variabili che utilizzerà nel suo lavoro, prima di farlo partire. Beh, le variabili sono esattamente quelle che ho scritto.
Inizializziamo Xo = 5; Xf:= 1000;
Perciò la tua funzione OnTimer diventerà:
Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.TTimerEngineOnTimer(Sender: TObject);
  2. var Y:
  3.   Integer;
  4. begin
  5.   Y:= Sin(Xo);
  6.   MyDisplay.Canvas.PutPixels[Xo, Y];
  7.   Xo:= Xo+1;
  8.   if Xo = Xf then
  9.     TTimerEngine.Enable:= False;
  10. end;



Perchè quella condizione Xo=Xf ? Perchè quando Xo ha raggiunto il valore finale, allora il timer deve smettere di funzionare.

Questo è tutto. Due precisazioni:
1) Il timer ovviamente si fa partire con l'istruzione TTimerEngine.Enable:= True; ricordati di disabilitarlo di default, nell'Object Inspector.
2) Questo esempio sommario che ti ho scritto, disegna i punti. Ovviamente arrivato qui, puoi inserire da solo anche le istruzioni che ti congiungono i punti o affini. Devi adattare ovviamente il tutto al tuo programma.

Spero che ora sia chiaro :D

PS: Anche io sono "alle prime armi". Ho da poco fatto i 18 anni, ma programmo seriamente da solo un'annetto... :D Tranquillo, col tempo e l'impegno si impara. L'importante è niente pappa pronta... :D

Fammi sapere

PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 20:38
Mercoledì, 29/12/2010
Il codice è illegibile. Se non passi il file di progetto, mi rifiuto di cercare anche solo la funzione che disegna la curva.
In termini generali, se tu disegni la curva punto per punto, a partire dal punto Xi al punto Xf finale, puoi far scegliere il tempo in secondi all'utente, in modo da impostare il timer ad un intervallo di (Xf-Xi) div (T * 1000) (dove T è il tempo in secondi) in modo da disegnare la funzione punto per punto.

Ultima modifica effettuata da a_butta il 29/12/2010 alle 20:40
PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 23:30
Mercoledì, 29/12/2010
hai considerato la mia possibile "soluzione"?

PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 1:07
Giovedì, 30/12/2010
cosa intendi per "passo passo"? Intendi "fare" il codice?
Beh se intendi quello, mi dispiace ma non è possibile, e per la filosofia dello stesso sito, e perché non sarebbe corretto in generale.
La domanda ora è: dove hai il problema?. Io ti ho posto una possibile soluzione; l'hai seguita? Ha portato a qualcosa? Ha generato qualche problema? Se ha generato qualche problema, postalo e ti aiuto su quello.
Se invece la mia risposta era solo una "falsa soluzione", perché non porta da nessuna parte, allora vediamo di porre il problema da zero.
Ma intanto partiamo da quella. Rileggi quello che ti ho scritto, e in base a quello capirai immediatamente cosa cambiare del tuo codice e come. Se anche allora non ti sarà chiaro, allora chiedi, ma specificatamente (esempio: come far partire il timer o da dove; perché questa espressione non viene generata come dovrebbe), non con un semplice: "cosa devo modificare del mio codice".

Queste sono le regole del forum... dura lex sed lex (diceva Cicero). :D
Niente pappa pronta:nono:

Senza rancore ;)

PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 21:06
Sabato, 01/01/2011
Ok. Ho provato da me.
Allora. L'errore principale è X:=0.
Pensa una cosa: ogni volta che il timer ripete il ciclo, la X viene azzerata... Quindi teoricamente saresti sempre fermo nel punto P(0,Sin(0))
Dunque. La variabile X deve essere azzerata quando fai partire il timer, cioè al click della CheckBox9, e puoi anche azzerarla, se vuoi, al termine del disegno:
Codice sorgente - presumibilmente Delphi

  1. procedure TForm5.TTimerEngineTimer(Sender: TObject);
  2. begin
  3.   //Codice del disegno
  4.   if X = Image1.Width Then
  5.     begin
  6.       TTimerEngine.Enabled:= False;
  7.       X:= 0;
  8.     end;
  9. end;



Per il problema del disegno sempre istantaneo suppongo che il problema sia questo: tu non hai rimosso la procedura vecchia, quella che funziona con un ciclo for, che magari parte dopo un giro di timer, mentre il timer resta fermo al punto P(0,Sin(0)) come spiegato su.

Il problema del FloatingPointOperation non so per tre motivi:
1) Non so che variabile sia X1;
2) Non so cosa contengano edit4 e edit2;
3) Non so su quale riga di quelle che mi hai scritto è l'errore :D

Per il resto dovrebbe essere giusto...
Una sola precisazione: in tal modo la funzione ti disegna solo i punti X e Y della funzione, ma non te li congiunge. Dunque ricordati di congiungerli con una linea :D

Aspetto tue risposte :D


PS: non so se l'hai fatto da solo, ma se è così... vedi che potevi riuscirci da solo?

PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 23:35
Sabato, 01/01/2011
Una domanda: sei sicuro che qualche volta quelle Edit non presentino value nulla?
Mi spiego:
Se Edit2.Text = "0" Allora StrToFloat(Edit2.Text) mi darà 0.
Ma se Edit.Text = "" (cioè è vuota), StrToFloat(Edit2.Text) restituirà errore (l'ho letto per la rete :) )

Per il problema del disegno non saprei dire così al volo. Prova a ripassarmi il progetto con tutte le modifiche...

PM
Avatar
rep87 (Normal User)
Newbie


Messaggi: 17
Iscritto: 27/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 22:49
Mercoledì, 29/12/2010
Ecco tutto il progetto. L'unità che devo modificare è la numero 5; vorrei inserirvi una Radiogroup con le tre opzioni "istantanea", "veloce", "lenta", legate alla velocità con cui il programma deve disegnare ogni funzione.
Spero proprio che saprai aiutarmi.


rep87 ha allegato un file: REALIZE EVERYTHING.zip (407254 bytes)
Clicca qui per scaricare il file
PM
Avatar
rep87 (Normal User)
Newbie


Messaggi: 17
Iscritto: 27/12/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 0:05
Giovedì, 30/12/2010
No...mi potresti dire passo-passo come fare?! Ad esempio, per la funzione seno, cosa dovrei modificare del mio codice? Per favore, aiutami! Sono giorni che mi ci scervello..:grr: :-o :d :om: :_doubt:..            :hail:   :hail:    :hail:

PM
Pagine: [ 1 2 ] Precedente | Prossimo