Vous cherchez un moyen de contrôler et de déplacer une forme sur un graphiqueJe recherche un moyen de contrôler et de déplacer une forme « dessinée » ou une série de formes sur un tracé (générateur de graphiques) à l'aide d'un script JSL, à des fins de visualisation de données. Considérez-le comme une animation utilisant une série d'images, puis faites-les défiler pour donner une impression de mouvement.
Par forme « dessinée », j'entends quelque chose comme :
Rectifier ()
Je pensais adopter l'approche suivante, mais je ne sais pas exactement comment l'exécuter ni s'il existe une meilleure approche :
- Scriptez/dessinez la ou les formes requises et associez-les à une variable (qui pourrait être une valeur de ligne) - nous appellerons cela un cadre
- Construire plusieurs cadres, avec la ou les formes requises dans différentes positions, chaque cadre étant attribué à une variable distincte
Par exemple
Image 1 - La forme est en position (X+0,Y) et associée à la variable (v = 1)
Image 2 - La forme est en position (X+1,Y) et associée à la variable (v = 2)
Image 3 - La forme est en position (X+2,Y) et associée à la variable (v = 3)
- Utilisez le filtre de données local pour faire défiler quelle variable est sélectionnée et donc la position de la ou des forme(s) dessinée(s)
J'espère que cela, comme décrit dans mon exemple, donnera l'impression que la forme se déplace dans la direction X+.
Comme mentionné ci-dessus, je ne suis pas sûr que cela fonctionnerait, le rapport du générateur de graphiques devrait être mis à jour/actualisé d'une manière ou d'une autre pour supprimer l'ancien dessin (écrasé) à la place du nouveau lorsque la variable sélectionnée est modifiée.
J'ai hâte de voir si quelque chose comme ça est possible et comment cela pourrait être codé.
Automatisation et scriptsExploration et visualisation des donnéesRe : Recherche d'un moyen de contrôler et de déplacer une forme sur un graphiquePourriez-vous fournir un meilleur exemple de ce que vous essayez de visualiser ? JMP a par exemple Mousetrap() qui peut dessiner des éléments en fonction de l'emplacement du curseur dans la 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">Re : Recherche d'un moyen de contrôler et de déplacer une forme sur un graphique</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>
Re : Recherche d'un moyen de contrôler et de déplacer une forme sur un graphiqueC'est vraiment chouette.
Je pense que je peux trouver une utilité à cela, j'ai hâte de jouer pour voir comment cela fonctionne.
Je souhaite maintenant adopter une approche plus passive de mon problème initial, je n'avais pas réalisé que l'on pouvait contrôler la vitesse et l'accélération d'une forme dans le temps comme dans l'exemple de Craige.
Re : Recherche d'un moyen de contrôler et de déplacer une forme sur un graphiqueCela a l'air vraiment bien, je pense que c'est ce que je recherche - j'aime vraiment la façon dont cela peut être axé sur le temps.
Serait-il possible de faire fonctionner cela pour un dessin plus complexe, tel que :
Couleur de remplissage (couleur RVB (255, 0, 0)) ;
Rect (50, 90, 60, 80, 1) ;
Couleur de remplissage (couleur RVB (204, 0, 0)) ;
Rect (51, 89, 59, 81, 1);
Couleur de remplissage (couleur RVB (255, 0, 0)) ;
Polygone ( {59, 89}, {60, 90}, {50, 90}, {51, 89});
Couleur de remplissage (couleur RVB (153, 0, 0)) ;
Polygone ( {60, 80}, {59, 81}, {51, 81}, {50, 80}) ;
Plutôt que de rebondir, lorsque le bas de la forme atteint l'axe X, je veux pouvoir la faire s'arrêter et rester en place.
De plus, après un temps donné, j'aimerais que d'autres formes dessinées entrent dans l'écran et suivent le même chemin, chacune s'installant sur l'axe X.
J'ai joué avec le script que vous avez envoyé, mais je ne sais pas trop comment le modifier de la bonne manière - vraiment intelligent !!!
Re : Recherche d'un moyen de contrôler et de déplacer une forme sur un graphiqueOui, tu peux faire ça. Il semble que votre objet ait une forme rigide et que vous souhaitiez qu'il s'arrête instantanément lorsqu'une condition est remplie. Ne pas ralentir ou déformer progressivement. Et il semble que vous disposerez de plusieurs objets qui pourraient être libérés au fil du temps. J'utiliserais une table de données avec une ligne par objet, avec des noms de colonnes similaires à ceux-ci :
Xpos Ypos Xvel Yvel XdeltaVel TdeltaVel IsActive IsDrawing Color Size Shape
Ensuite, j'écrirais deux fonctions : UpdateRow (numéro de ligne, deltaTime) et DrawRow (numéro de ligne). UpdateRow pourrait ressembler à ceci (non testé, à peu près correct...) :
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 fonction DrawRow ressemble à ceci :
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
)
);
Désormais, le script graphique devient une paire de boucles sur dtQ, la première pour appliquer les mises à jour et la seconde pour réaliser le dessin. Vous n'êtes pas obligé de les séparer, mais cela pourrait vous être utile plus tard si vous décidez de gérer les collisions.
Dans cet exemple, le tableau de données dans dtQ pourrait également être affiché avec le générateur de graphiques en traçant les valeurs xpos, ypos, couleur, taille et forme. GraphBuilder se mettra à jour automatiquement et vous n'aurez pas besoin de la fonction DrawRow. Je ne l'ai jamais utilisé mais je pense qu'il pourrait y avoir un mécanisme de dessin de forme personnalisé pour les points.
Si vous essayez de créer une vidéo (plutôt qu'un affichage interactif en temps réel), optez pour 30 ou 60 FPS et laissez le temps delta être constant d'une image à l'autre. Ci-dessus, j'ai choisi les numéros qui le faisaient fonctionner sur ma machine. Mais si je choisissais 1/30 et créais un ensemble d’images numérotées, elles produiraient une vidéo très fluide.