Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 15 su 15

Discussione: Oscilloscopio

  1. #11
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao.
    Io posso anche commentare riga per riga ma spero tu abbia almeno qualche base di programmazione, almeno concettualmente.. altrimenti ci sarebbe bisogno più che altro di un corso accelerato.. Comunque sia dovresti iniziare a leggerti sulla guida il funzionamento dei vari comandi ActionScript, capiresti sicuramente meglio..
    Ci sono dei concetti che anche per me viene difficile da spiegare. :master:

    Comunque ci provo:
    Codice PHP:
    // valori iniziali
    var f:Number 1// variabile utilizzata per stabilire la frequenza
    var v:Number 40// variabile utilizzata per stabilire il voltaggio
    var t:Number 0// variabile utilizzata come indice del tempo
    freq.text f// imposto il valore sul campo freq
    volt.text v// imposto il valore sul campo volt
    // dimensioni grafico
    var gw:Number 450// larghezza che deve avere l'area del grafico
    var gh:Number 200// altezza che deve avere l'area del grafico
    // posizione grafico
    var gx:Number 50// posizione x dell'area del grafico, considerando come punto di registrazione il suo angolo superiore sinistro
    var gy:Number 100// posizione y
    // aggiornamento valori
    var aggiorna = function () {// funzione richiamata quando premo invio o quando deseleziono un campo di testo
        
    freq.text// aggiorno la variabile f in base al valore del campo freq
        
    volt.text// aggiorno la variabile v in base al valore del campo volt
    };
    var 
    key:Object = new Object(); // creo un oggetto key, per il listener
    key.onKeyDown = function() { // assegno l'evento KeyDown all'oggetto key
        
    if (Key.getCode() == 13) { // se l'ultimo tasto premuto è "invio"
            
    aggiorna(); // esegui la funzione "aggiorna"
        
    }
    };
    Key.addListener(key); // aggiungo il listener all'oggetto key
    freq.onKillFocus volt.onKillFocus=aggiorna// la stessa funzione aggiorna vale per onKillFocus dei due campi (evento che si verifica quando si deseleziona un campo)
    // creo contenitore per il grafico
    _root.createEmptyMovieClip('grafico'0); // creo un clip vuoto e lo istanzio con nome "grafico"
    grafico.createEmptyMovieClip('monitor'100); // al suo interno creo un ulteriore contenitore e lo istanzio come "monitor" (in questa istanza verrà disegnato il grafico)
    with (grafico) { // all'interno del clip grafico
        // creo un riquadro di sfondo
        
    beginFill(0xeeeeee); // inizio il riempimento con colore grigio chiaro
        
    lineStyle(00xaaaaaa); // assegno uno stile per il tratto di contorno (spessore sottile, colore grigio medio)
        
    moveTo(00); // imposto il punto in cui inizio a disegnare il riquadro, alle coordinate x:0, y:0
        
    lineTo(1000); // creo una linea fino alle coordinate x:100, y:0
        
    lineTo(100100); // continuo la linea fino alle coordinate x:100, y:100
        
    lineTo(0100); // continuo la linea fino alle coordinate x:0, y:100
        
    lineTo(00); // continuo la linea fino a chiuderla col punto iniziale
        
    endFill(); // fine del riempimento del riquadro di sfondo
        // creo una linea orizzontale al centro del riquadro di sfondo
        
    moveTo(050); // sposto il punto per riprendere a disegnare, alle coordinate x:0, y:50
        
    lineTo(10050); // creo una linea fino alle coordinate x:100, y:50
        
    _x gx// imposto la proprietà _x dell'istanza "grafico"
        
    _y gy// imposto la proprietà _y dell'istanza "grafico"
        
    _width gw// imposto la larghezza dell'istanza "grafico"
        
    _height gh// imposto la lunghezza dell'istanza "grafico"
        
    monitor._y 50// imposto la  proprietà _y dell'istanza "monitor" in modo che la sinusoide venga poi disegnata al centro del riquadro
    }
    // reset del grafico
    var reset = function () { // funzione richiamata una prima volta all'avvio del filmato (per inizializzare l'istanza "monior") e ogni volta che il tracciato, disegnato nel monitor, raggiunge la lunghezza massima.
        
    with (grafico.monitor) { // all'interno dell'istanza "monitor"
            
    clear(); // cancello il tracciato disegnato precedentemente (ovviamente la prima volta non ha nessun effetto perche non è ancora stato disegnato niente)
            
    lineStyle(00xff000070); // riassegno lo stile linea per il nuovo tracciato da disegnare 
            
    moveTo(00); // reimposto il punto di inizio del tracciato
        
    }
    };
    reset(); // richiamo la funzione per inizializzare l'istanza "monitor"
    // aggiorno il grafico
    _root.onEnterFrame = function() { // utilizzo un evento enterFrame per creare, nel tempo, la tracciatura del grafico
        
    var p:Number Math.sin(t/100*(f*2)*Math.PI)*(v/2); // calcolo il punto p, cioè il valore ottenuto in funzione del tempo e della sinusoide sviluppata in base ai valori f e v
        
    grafico.monitor.lineTo(tp); // traccio (continuo) il segmento fino al nuovo punto x:t, y:p
        
    += .5;// incremento la variabile t, indicante lo scandire del tempo sul grafico (l'incremento è convenzionale e può non rispettare, come in questo caso, il tempo reale)
        
    (t>(%= 100)) && reset(); //.....e questa come te la spiego?
        // quest'ultima riga ha diverse funzioni che sono espresse in modo contratto.
        // è principalmente una condizione.. puoi notare la forma "(condizione) && (azione)".
        // nella condizione utilizzo l'operatore modulo (%), per controllare se t è maggiore del suo valore "modulato".
        // questo significa che se t arriva al valore 100, il suo valore modulato è 0, quindi la condizione è vera e viene richiamata la funzione reset.
        // allo stesso tempo, alla variabile t, viene assegnato ogni volta il valore modulato. (t %= 100) si può anche scrivere (t = t%100)
    }; 
    Spero sia un po' più chiaro..
    Buono studio
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  2. #12
    Altro che se è chiaro !!!

    troppe grazie killer ho finito di romperti adesso !!!

    in bocca al lupo per tutto grazie mille ancora ciauuuuuuuuuuuu!!!!!!!!!!!!!!!!!!

  3. #13
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    No problem!
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  4. #14
    var p:Number = Math.sin(t/100*(f*2)*Math.PI)*(v/2);

    ...Killer...o meglio qualcuno... ...sapreste spiegarmi esattamente come "procede" questa formula??

    da quel che capisco math.sin è la funzione matematica che calcola la sinusoide no?...
    ma math.PI ???

    vi prego help....

    grazie in anticipo a chi mi aiuta...ciau!!!

  5. #15
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Dunque.. la funzione Math.sin restituisce il seno dell'angolo indicato il quale è espresso in radianti..

    Math.PI non è altro che il valore di "P greco" e serve sostanzialmente a convertire l'angolo da gradi a radianti in modo da essere digerito dalla funzione sin, in quanto il nostro valore in ingresso sarà in gradi..

    Normalmente si utilizza la seguente formula generale:

    codice:
    radianti = gradi*Math.PI/180;
    Math.sin(radianti);
    ovvero:

    codice:
    Math.sin(gradi*Math.PI/180)
    Il valore restituito varia da -1 a 1 a seconda dell'angolo indicato.
    Alcuni esempi:

    per gradi=0 restituisce 0
    per gradi=45 restituisce circa 0.707
    per gradi=90 restituisce 1
    per gradi=180 restituisce circa 0
    per gradi=270 restituisce -1
    per gradi=360 restituisce circa 0


    Infatti il valore del seno non è altro che... http://www.ripmat.it/mate/i/ib/ibbaa.html

    In realtà nella formula elaborata da me, il valore "t" non è espresso in gradi ma va da 0 a 100, quindi bisogna convertirlo in gradi..
    Per cui avremo la seguente uguaglianza:

    codice:
    gradi/360 = t/100
    Da cui otteniamo:

    codice:
    gradi = t/100*360
    Applicandolo alla formula iniziale, avremmo:

    codice:
    Math.sin(t/100*360*Math.PI/180)
    ..e quindi, semplificando

    codice:
    Math.sin(t/100*2*Math.PI)
    Infine, alla formula ottenuta, applicheremo il valore "f" (frequenza) che moltiplicherà "t"..

    codice:
    Math.sin(t/100*f*2*Math.PI)
    cioè andremo ad incrementare l'angolo (valore in ingresso) in funzione di "f".. dove, all'aumentare di f, si avranno delle alternanze ad intervalli più brevi tra gli estremi -1 e 1, e viceversa, si avranno delle alternanze con intervalli più ampi, per valori più piccoli di incremento.

    Tutto questo avviene per un immaginario cerchio il cui raggio è pari ad 1.
    Per questo i valori ottenuti vanno da -1 a 1.
    Quindi è come scrivere:

    codice:
    raggio=1;
    Math.sin(t/100*f*2*Math.PI)*raggio;
    Per aumentare l'ampiezza dell'onda, dobbiamo aumentare semplicemente il valore del raggio.

    Ma nel nostro caso, il raggio è datto dal valore "v/2" (in effetti "v" corrisponde al diametro).

    Per cui la formula diventa:

    codice:
    Math.sin(t/100*f*2*Math.PI)*v/2;
    Mi raccomando, studiate che la prossima volta interrogo!
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.