Alla ricerca di un modo per controllare e spostare una forma su un graficoSto cercando un modo per controllare e spostare una forma "disegnata" o una serie di forme sulla trama (costruttore di grafici) utilizzando lo script JSL, per scopi di visualizzazione dei dati. Pensatela come un'animazione che utilizza una serie di fotogrammi e poi li scorre per dare l'impressione di movimento.
Per forma "disegnata" intendo qualcosa del tipo:
Rett ()
Stavo pensando di adottare il seguente approccio, ma non sono sicuro esattamente di come eseguirlo o se esiste un approccio migliore:
- Script/disegna le forme richieste e associale a una variabile (che potrebbe essere un valore di riga) - lo chiameremo frame
- Costruire più fotogrammi, con le forme richieste in diverse posizioni, con ciascun fotogramma assegnato a una variabile distinta
Per esempio
Frame 1: la forma è in posizione (X+0,Y) e associata alla variabile (v = 1)
Frame 2: la forma è in posizione (X+1,Y) e associata alla variabile (v = 2)
Frame 3: la forma è in posizione (X+2,Y) e associata alla variabile (v = 3)
- Utilizza il filtro dati locale per scorrere quale variabile è selezionata e quindi la posizione delle forme disegnate
Spero che questo, come descritto nel mio esempio, dia l'impressione che la forma si muova nella direzione X+.
Come già accennato, non sono sicuro che funzionerebbe, il report del generatore di grafici dovrebbe essere aggiornato/rinfrescato in qualche modo per rimuovere il vecchio disegno (sovrascritto) al posto di quello nuovo quando la variabile selezionata viene modificata.
Sono ansioso di vedere se qualcosa del genere è possibile e come potrebbe essere codificato.
Automazione e scriptingEsplorazione e visualizzazione dei datiRe: Alla ricerca di un modo per controllare e spostare una forma su un graficoPotresti fornire un esempio migliore di ciò che cerchi di visualizzare? JMP, ad esempio, ha Mousetrap() che può disegnare oggetti in base alla posizione del cursore nel framebox
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Variables(X(:weight), Y(:height), Overlay(:sex)),
Elements(Points(X, Y, Legend(9)), Line Of Fit(X, Y, Legend(11)))
);
exx = 70;
exy = 70;
Report(gb)[FrameBox(1)] << Add Graphics Script(
Mousetrap(
exx = x;
exy = y;
);
Rect({exx - 10, exy - 10}, {exx, exy});
);
</CODE></P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-751817" slang="en-US" mode="CREATE">Ri: Alla ricerca di un modo per controllare e spostare una forma su un grafico</LINGO-SUB><LINGO-BODY id="lingo-body-751817" slang="en-US" mode="CREATE"><PRE><CODE class=" language-jsl">x1 = y1 = x2 = y2 = 0;
keepRunning=1;
New Window( "Example", gb = Graph Box( Frame Size( 800, 800 ), Oval( x1, y1, x2, y2 ) ), <<ONCLOSE></ONCLOSE>
<P></P><iframe src="https://players.brightcove.net/6058004218001/default_default/index.html?videoId=6352215904112" width="960" height="540" allowfullscreen allow="encrypted-media"></iframe>Looks like some rusty physics.<P></P>
Ri: Alla ricerca di un modo per controllare e spostare una forma su un graficoQuesto è davvero carino.
Penso di poter trovare un utilizzo per questo, non vedo l'ora di provarlo per vedere come funziona.
Ora sono interessato ad adottare un approccio più passivo al mio problema iniziale, non mi ero reso conto che puoi controllare la velocità di una forma e l'accelerazione nel tempo come nell'esempio di Craige.
Ri: Alla ricerca di un modo per controllare e spostare una forma su un graficoSembra davvero bello, penso che sia quello che sto cercando: mi piace molto come questo possa essere guidato dal tempo.
Sarebbe possibile farlo funzionare per un disegno più complesso, come ad esempio:
Colore riempimento (Colore RGB (255, 0, 0));
Rettangolo (50, 90, 60, 80, 1);
Colore riempimento (Colore RGB (204, 0, 0));
Retto (51, 89, 59, 81, 1);
Colore riempimento (Colore RGB (255, 0, 0));
Poligono ( {59, 89}, {60, 90}, {50, 90}, {51, 89});
Colore riempimento( Colore RGB( 153, 0, 0 ) );
Poligono ({60, 80}, {59, 81}, {51, 81}, {50, 80});
Invece di rimbalzare, quando la parte inferiore della forma colpisce l'asse X, voglio essere in grado di fermarla e rimanere sul posto.
Inoltre, dopo che è trascorso un determinato tempo, vorrei che altre forme disegnate entrassero nello schermo e seguissero lo stesso percorso, ognuna posizionandosi sull'asse X.
Ho provato con lo script che hai inviato, ma non sono sicuro di come modificarlo nel modo giusto: davvero intelligente!!!
Re: Alla ricerca di un modo per controllare e spostare una forma su un graficoSi, puoi farlo. Sembra che il tuo oggetto abbia una forma rigida e desideri che si fermi immediatamente quando viene soddisfatta una condizione. Non rallentare o distorcere gradualmente. E sembra che avrai più oggetti che potrebbero essere rilasciati nel tempo. Utilizzerei una tabella dati con una riga per oggetto, con nomi di colonna simili a questi:
Xpos Ypos Xvel Yvel XdeltaVel TdeltaVel IsActive IsDrawing Color Size Shape
Quindi scriverei due funzioni: UpdateRow( row number, deltaTime ) e DrawRow( row number ). UpdateRow potrebbe assomigliare a questo (non testato, approssimativamente corretto...):
UpdateRow = function({rowNumber, deltaTime}
if( dtQ:isActive[rowNumber],
dtQ:Xpos[rowNumber] += dtQ:Xvel[rowNumber] * deltaTime;
dtQ:Ypos[rowNumber] += dtQ:Yvel[rowNumber] * deltaTime;
// you might want the velocity to change as well, possibly using the deltaVelocity,
// make sure the Xs and Ys stay together
// do a test to see if still active
if( dtQ:y[rowNumber] <= 0, // whatever condition makes it stop
dtQ:isActive[rowNumber] = 0;
dtQ:isDrawing[rowNumber] -= 1; // count down until vanishes
)
}
When you add a row to the table (dtQ, above, I tend to use dt for a table not delta time!) make sure to set the row's value for isActive to 1, and if you want the non-active objects to eventually expire, set the isDrawing to 100 or 1000 to control how many cycles go by before it stops drawing.
La funzione DrawRow è simile alla seguente:
DrawRow = function({RowNumber},
if( dtQ:isDrawing[RowNumber],
// your code goes here. Add the dtQ:Xpos[RowNumber] to your X coords
// and same for Ypos/Y.
// .... use the color/size/shape values from the row if you find them useful
)
);
Ora lo script grafico diventa una coppia di cicli su dtQ, il primo per applicare gli aggiornamenti e il secondo per eseguire il disegno. Non è necessario tenerli separati, ma potrebbe esserti utile in seguito se decidi di gestire le collisioni.
In questo esempio, la tabella dati in dtQ potrebbe anche essere visualizzata con il generatore di grafici tracciando i valori xpos, ypos, colore, dimensione e forma. GraphBuilder si aggiornerà automaticamente e non avrai bisogno della funzione DrawRow. Non l'ho mai usato, ma penso che potrebbe esserci un meccanismo di disegno di forme personalizzate per i punti.
Se stai cercando di realizzare un video (piuttosto che una visualizzazione interattiva in tempo reale), accontentati di 30 o 60 FPS e lascia che il tempo delta sia costante da un fotogramma all'altro. Sopra, ho scelto i numeri che lo hanno fatto funzionare sulla mia macchina. Ma se scegliessi 1/30 e creassi una serie di immagini numerate, il video sarebbe molto fluido.