寻找一种方法来控制和移动图形上的形状我正在寻找一种方法来使用 JSL 脚本控制和移动绘图(图形生成器)上的“绘制”形状或一系列形状,以实现数据可视化。可以将其视为使用一系列帧的动画,然后滚动它们以给人以运动的印象。
我所说的“绘制”形状指的是:
矩形 ()
我正在考虑采用以下方法,但我不确定具体如何执行或是否有更好的方法:
- 编写脚本/绘制所需的形状并将它们与变量(可以是行值)关联 - 我们将其称为框架
- 构建多个框架,将所需的形状放置在不同的位置,并将每个框架分配给不同的变量
例如
框架 1 - 形状位于位置 (X+0,Y) 并与变量 (v = 1) 关联
框架 2 - 形状位于位置 (X+1,Y) 并与变量 (v = 2) 关联
框架 3 - 形状位于位置 (X+2,Y) 并与变量 (v = 3) 关联
- 使用本地数据过滤器滚动选择哪个变量,从而滚动绘制形状的位置
我希望这能像我的例子所述那样,给人一种形状朝 X+ 方向移动的印象。
如上所述,我不确定这是否会起作用,当所选变量被更改时,图形生成器报告需要以某种方式更新/刷新以删除旧绘图(覆盖)以代替新绘图。
我很想看看这样的事情是否有可能以及如何对其进行编码。
自动化和脚本数据探索与可视化回复:寻找一种方法来控制和移动图形上的形状您能否提供更好的示例来说明您尝试可视化的内容?例如,JMP 有 Mousetrap(),它可以根据框架框中的光标位置绘制内容
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">回复:寻找一种方法来控制和移动图形上的形状</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>
回复:寻找一种方法来控制和移动图形上的形状这真是太棒了。
我想我可以找到它的用途,我很想尝试一下看看它是如何工作的。
我现在热衷于采取一种更加被动的方法来解决我最初的问题,我没有意识到你可以像 Craige 的例子那样控制形状的速度、加速度随时间的变化。
回复:寻找一种方法来控制和移动图形上的形状这看起来真的很好,我想这就是我想要的——我真的很喜欢它如何由时间驱动。
是否有可能让它用于更复杂的绘图,例如:
填充颜色(RGB颜色(255, 0, 0));
矩形(50,90,60,80,1);
填充颜色(RGB 颜色( 204, 0, 0 ));
矩形(51,89,59,81,1);
填充颜色(RGB颜色(255, 0, 0));
多边形({59,89},{60,90},{50,90},{51,89});
填充颜色(RGB 颜色( 153, 0, 0 ));
多边形({60,80},{59,81},{51,81},{50,80});
当形状的底部碰到 X 轴时,我希望它能够停止并保持在原位,而不是弹跳。
另外,在经过一段给定的时间之后,我希望其他绘制的形状进入屏幕并遵循相同的路径,每个形状都稳定在 X 轴上。
我已经尝试过您发送的脚本,但不太清楚如何以正确的方式修改它——真聪明!!!
回复:寻找一种方法来控制和移动图形上的形状是的,你可以这样做。听起来你的物体具有刚性形状,你希望它在满足某些条件时立即停止。而不是逐渐减速或扭曲。听起来你将有多个物体可能会随着时间的推移而释放。我会使用一个数据表,每个对象一行,列名类似于以下内容:
Xpos Ypos Xvel Yvel XdeltaVel TdeltaVel IsActive IsDrawing Color Size Shape
然后我会写两个函数:UpdateRow(行号,deltaTime)和DrawRow(行号)。UpdateRow可能看起来像这样(未经测试,大致正确......):
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.
DrawRow 函数如下所示:
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
)
);
现在图形脚本变成了 dtQ 上的一对循环,第一个循环应用更新,第二个循环进行绘制。您不必将它们分开,但如果您决定处理碰撞,您可能会发现它以后很有用。
在此示例中,dtQ 中的数据表也可以通过绘制 xpos、ypos、颜色、大小、形状值来使用图形生成器显示。GraphBuilder 将自动更新,您不需要 DrawRow 函数。我从未使用过它,但我认为可能存在针对点的自定义形状绘制机制。
如果您尝试制作视频(而不是交互式实时显示),请将 FPS 设置为 30 或 60,并让帧与帧之间的时间差保持不变。上面,我选择了可以在我的机器上运行的数字。但如果我选择 1/30 并制作一组编号图像,它们将制作出非常流畅的视频。