Buscando una manera de controlar y mover una forma a través de un gráficoEstoy buscando una manera de controlar y mover una forma o serie de formas "dibujadas" a lo largo de la trama (creador de gráficos) utilizando un script JSL, para fines de visualización de datos. Piense en ello como una animación que utiliza una serie de fotogramas y luego se desplaza a través de ellos para dar la impresión de movimiento.
Por forma "dibujada" me refiero a algo como:
Rectificado ()
Estaba pensando en adoptar el siguiente enfoque, pero no estoy seguro exactamente de cómo ejecutarlo o si existe un enfoque mejor:
- Script/dibujar las formas requeridas y asociarlas con una variable (que podría ser un valor de fila). A esto lo llamaremos marco.
- Construya múltiples marcos, con las formas requeridas en diferentes posiciones, con cada marco asignado a una variable distinta
P.ej
Cuadro 1: la forma está en la posición (X+0,Y) y asociada con la variable (v = 1)
Cuadro 2: la forma está en la posición (X+1,Y) y asociada con la variable (v = 2)
Cuadro 3: la forma está en la posición (X+2,Y) y asociada con la variable (v = 3)
- Utilice el filtro de datos local para desplazarse por la variable seleccionada y, por lo tanto, la posición de las formas dibujadas.
Espero que esto, como se describe en mi ejemplo, dé la impresión de que la forma se mueve en la dirección X+.
Como se mencionó anteriormente, no estoy seguro de que esto funcione, el informe del generador de gráficos debería actualizarse/actualizarse de alguna manera para eliminar el dibujo antiguo (sobrescrito) en lugar del nuevo cuando se cambia la variable seleccionada.
Estoy ansioso por ver si algo como esto es posible y cómo podría codificarse.
Automatización y secuencias de comandosExploración y visualización de datosRe: Buscando una manera de controlar y mover una forma a través de un gráfico¿Podrías dar un mejor ejemplo sobre lo que intentas visualizar? JMP, por ejemplo, tiene Mousetrap() que puede dibujar cosas según la ubicación del cursor en el cuadro de marco.
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: Buscando una manera de controlar y mover una forma a través de un gráfico</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: Buscando una manera de controlar y mover una forma a través de un gráficoEsto es realmente genial.
Creo que puedo encontrarle un uso a esto, estoy ansioso por probarlo y ver cómo funciona.
Ahora estoy interesado en adoptar un enfoque más pasivo para mi problema inicial. No me di cuenta de que se puede controlar la velocidad y la aceleración de una forma en el tiempo, como en el ejemplo de Craige.
Re: Buscando una manera de controlar y mover una forma a través de un gráficoEsto se ve muy bien, creo que esto es lo que busco; realmente me gusta cómo esto se puede controlar en el tiempo.
¿Sería posible hacer que esto funcione para un dibujo más complejo, como por ejemplo:
Color de relleno (Color RGB (255, 0, 0));
Rectificado (50, 90, 60, 80, 1);
Color de relleno (Color RGB (204, 0, 0));
Rectificado (51, 89, 59, 81, 1);
Color de relleno (Color RGB (255, 0, 0));
Polígono ({59, 89}, {60, 90}, {50, 90}, {51, 89});
Color de relleno (Color RGB (153, 0, 0));
Polígono ({60, 80}, {59, 81}, {51, 81}, {50, 80});
En lugar de rebotar, cuando la parte inferior de la forma llega al eje X, quiero poder detenerla y permanecer en su lugar.
Además, después de que haya transcurrido un tiempo determinado, me gustaría que otras formas dibujadas ingresen a la pantalla y sigan el mismo camino, cada una colocándose en el eje X.
He probado con el script que me enviaste, pero no estoy seguro de cómo modificarlo de la manera correcta. ¡¡¡Realmente inteligente!!!
Re: Buscando una manera de controlar y mover una forma a través de un gráficoSi tu puedes hacerlo. Parece que su objeto tiene una forma rígida y desea que se detenga instantáneamente cuando se cumpla alguna condición. No desacelerar ni distorsionar gradualmente. Y parece que tendrá varios objetos que pueden liberarse con el tiempo. Usaría una tabla de datos con una fila por objeto, con nombres de columnas similares a estos:
Xpos Ypos Xvel Yvel XdeltaVel TdeltaVel IsActive IsDrawing Color Size Shape
Luego escribiría dos funciones: UpdateRow (número de fila, deltaTime) y DrawRow (número de fila). UpdateRow podría verse así (no probado, aproximadamente correcto...):
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 función DrawRow se parece a esto:
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
)
);
Ahora el script de gráficos se convierte en un par de bucles sobre dtQ, el primero para aplicar las actualizaciones y el segundo para hacer el dibujo. No es necesario que los mantenga separados, pero puede que le resulte útil más adelante si decide gestionar las colisiones.
En este ejemplo, la tabla de datos en dtQ también podría mostrarse con el generador de gráficos trazando los valores xpos, ypos, color, tamaño y forma. GraphBuilder se actualizará automáticamente y no necesita la función DrawRow. Nunca lo he usado, pero creo que podría haber un mecanismo de dibujo de formas personalizado para los puntos.
Si está intentando hacer un video (en lugar de una visualización interactiva en tiempo real), opte por 30 o 60 FPS y deje que el tiempo delta sea constante de cuadro a cuadro. Arriba, seleccioné los números que hicieron que funcionara en mi máquina. Pero si escogiera 1/30 y creara un conjunto de imágenes numeradas, obtendría un vídeo muy fluido.