2011-09-07 18 views
5

Non riesco a ottenere la sintassi per fare ciò che voglio, e ora non sono sicuro se sia possibile.è possibile utilizzare il secondo argomento di Dynamic nell'impostazione delle variabili di controllo in Manipulation?

piccola recensione: Si può fare questo:

{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]} 

e ora ogni volta che il cursore si muove, cambia 'b', e il suo peccato [] verrà automaticamente stampato

enter image description here

Ma supponiamo che voglio fare il calcolo (Sin []) direttamente dove è il cursore e mostrare solo il risultato finale di Sin [], quindi posso usare il secondo argomento di Dynamic come questo:

{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}], 
Dynamic[a]} 

enter image description here

Ora voglio usare manipolare e fare la stessa cosa. Posso fare lo stesso del primo esempio precedente come questo:

Manipulate[ 
Sin[b], 
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] 
] 

enter image description here

In quanto sopra, manipolare ha curato la roba 'dinamica', e aggiornati Sin [b] ogni volta che cambia 'b' .

Ora, voglio vedere se riesco a fare il secondo caso utilizzando manipolare, così posso scrivere:

Manipulate[ 
a, 
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] (*where to insert Sin[b]?*) 
] 

('a' deve inizializzato ad un valore per la visualizzazione iniziale).

Ma non sono in grado di capire come utilizzare il secondo argomento per "b" in precedenza. Non riesci a capire la sintassi, e ora sono sicuro che sia possibile?

ovviamente, non si può solo scrivere

Manipulate[ 
a, 
{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}]} 
] 

Questa non è la sintassi nemmeno valida di manipolare controlli.

La domanda è: è possibile utilizzare il secondo argomento di Dinamico nell'impostazione dei controlli di manipolazione?

Il motivo che sto chiedendo è che potrebbe rendere più semplice il calcolo "localizzato" proprio lì, dove la variabile di controllo cambia e mostra solo il risultato finale altrove. Come una funzione di callback locale in un modo, dove il calcolo relativo alle modifiche per ciascun controllo si trova proprio accanto al punto in cui si trova il controllo.

grazie

aggiornamento 9/16/11

Ebbene, dopo un mese di lotta, finalmente ho il Mathematica CDF attivo e funzionante.

Grazie all'aiuto del trucco mostrato qui da Simon e altri che hanno risposto alle mie domande mentre stavo facendo questo CDF (Leonid, Heike, WReach, Belisarius e altri).

I pochi trucchi che ho imparato qui hanno aiutato a terminare questa dimostrazione, ecco uno link se qualcuno vuole provarlo.

enter image description here

Il design di questo CDF è diverso da tutto quello che ho fatto prima. Si basa su una macchina a stati finiti. C'è solo un simbolo tracciato nell'intero CDF. Usando il secondo argomento della dinamica, il nome dell'evento viene registrato e nell'espressione principale di Manipulate, che esegue le macchine a stati finiti, ha 5 stati in cui può essere inserito, e ci sono 8 eventi. A seconda dello stato corrente e dell'evento corrente appena trascorso, passa al nuovo stato (o può rimanere nello stesso stato, a seconda del caso) e il display principale viene aggiornato. Non è necessario alcun trigger. La macchina a stati funziona alla velocità consentita, controllata solo dalla dimensione del passo temporale.

Questo semplifica notevolmente la logica e consente di gestire l'interfaccia utente molto più avanzata e la logica interdipendente, poiché tutto ora viene eseguito in un modo ben controllato e tutta la logica è in un unico punto.

Senza essere in grado di impostare l'evento utilizzando il secondo argomento di dinamica, l'intero approccio non sarebbe stato possibile.

Ho bisogno di scrivere una nota su questo metodo per renderlo più chiaro.

Quindi, volevo solo ringraziare tutti qui. Ora sto finendo un altro CDF usando questo metodo, una simulazione a pendolo triplo.

+0

Wow, il risultato finale sembra davvero bello! Funziona lentamente sulla mia macchina, ma molte cose fanno ... Sarebbe bello se potessi fornire un link per il download per coloro che non possono usare il plugin del browser. – Simon

+1

@Simon, ho appena aggiunto 2 link lì per il CDF e il notebook stesso. http://12000.org/my_notes/mma_demos/simple_pendulum_damped_driven/index.htm viene eseguito il più velocemente possibile, non esiste un clock diverso dalla Dynamic tracciata. – Nasser

+0

Ora ho un'idea migliore del problema della "lentezza". Quando vengono visualizzate più cose, l'aggiornamento dello schermo inizia a richiedere più tempo e l'intero ciclo rallenta, in attesa che lo schermo venga dipinto ogni volta. Ottenere fps più alti è stato un problema per me con le demo della CDF. Non so se ci sono trucchi per renderlo più efficiente o meno. Ma sicuramente sembra essere dovuto a questo. Quando riduco il numero di grafici/grafici da visualizzare, la simulazione viene eseguita più velocemente. Nessun orologio è usato, solo un ciclo con Show [Graphics [..]] in esso. L'ultima CDF che ho appena terminato ha mostrato questo problema in modo molto chiaro. – Nasser

risposta

7

Non tutti gli argomenti di Manipulate dopo il primo devono essere Control oggetti. Puoi mettere tutto ciò che ti piace - inclusi i controlli dinamici completamente personalizzati. Quindi, come di qualcosa di simile

Manipulate[a, {a, None}, {b, None}, 
Row[{"b= ",Slider[Dynamic[b, (b = #; a = Sin[b]; #)&], {-2 Pi, 2 Pi}]}]] 

Qualora il {a, None} e {b, None} garantire che le variabili sono locali, ma non sono strettamente necessari.

+0

Bel trucco Simon! Questo apre nuove possibilità :). A proposito, non so perché hai aggiunto Dynamic prima di Row sopra. Funziona senza, in questo modo: Riga [{"b =", Dispositivo di scorrimento [Dinamico [b, (b = #; a = Sin [b]; #) &], {-2 Pi, 2 Pi}]}} ], la dinamica extra non sembra essere necessaria. Grazie ancora! – Nasser

+0

@Nasser: Grazie, ho rimosso quella 'dinamica 'estranea. – Simon

+0

Ho provato questo metodo e funziona molto bene. Ho semplificato molto la logica. Ora, ho una macchina a stati nell'espressione Manipolazione, e posso cambiare lo stato ogni volta che qualsiasi controllo cambia facilmente. Prima dovevo usare il complicato codice dinamico/di aggiornamento dappertutto per ogni controllo, o insieme di controlli, per rilevare quando un controllo cambia. Ma ora posso semplicemente cambiare lo stato proprio lì semplicemente senza usare Dynamic [Aggiorna [..]] nell'espressione Manipolazione principale.Usando Which [] nell'espressione principale di Manipolazione, so sempre in quale stato mi trovo. – Nasser

Problemi correlati