我无法使用我想要的语法,现在我不确定它是否可能。
小评论: 人们可以这样做:
{Slider[Dynamic[b], {-2 Pi, 2 Pi}], Dynamic[Sin[b]]}
现在每次滑块移动时,'b'改变,其Sin []自动打印
但是假设我想直接在滑块所在的位置进行计算(Sin [])并且只显示Sin []的最终结果,那么我可以像这样使用Dynamic的第二个参数:
{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}],
Dynamic[a]}
现在我想使用Manipulate,并做同样的事情。我可以像上面第一个例子那样做:
Manipulate[
Sin[b],
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}]
]
在上面,Manipulate负责处理'动态'的东西,并在'b'改变时更新Sin [b]。
现在,我想知道我是否可以使用Manipulate进行第二种情况,所以我可以写一下:
Manipulate[
a,
Control[{{b, 0, "b="}, -2 Pi, 2 Pi, ControlType -> Slider}] (*where to insert Sin[b]?*)
]
('a'必须初始化为初始显示的某个值)。
但我无法弄清楚如何在上面使用'b'的第二个参数。无法弄清楚语法,现在确定是否可能?
当然,不能只写
Manipulate[
a,
{Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {-2 Pi, 2 Pi}]}
]
这甚至不是Manipulate控件的有效语法。
问题是:在设置Manipulate控件时是否可以使用Dynamic的第二个参数?
我之所以要问的原因是它可以让控制变量更改的位置更容易“本地化”计算,并且只能在其他位置显示最终结果。就像某种方式的本地回调函数一样,与每个控件的更改相关的计算位于控件所在的位置旁边。
感谢
更新9/16/11
好吧,经过一个月的奋斗,我终于开始运行Mathematica CDF了。
感谢Simon和其他在我做CDF(Leonid,Heike,WReach,Belisarius等人)时回答我问题的人的帮助。
我在这里学到的一些技巧帮助完成了这个演示,如果有人想尝试的话,这里是link。
这张CDF的设计与我之前所做的一切不同。它基于有限状态机。整个CDF中只有一个跟踪符号。使用动态的第二个参数,记录事件名称,并且在运行有限状态机的Manipulate的主表达式中,它有5个状态,并且有8个事件。根据当前状态和刚刚发生的当前事件,它会切换到新状态(或者可以保持相同的状态,具体取决于),并且主显示屏会更新。无需触发器。状态机运行速度与您允许的速度一样快,仅受时间步长控制。
这极大地简化了逻辑,并且可以处理更高级的UI和相互依赖的逻辑,因为现在所有内容都以良好控制的方式运行,并且所有逻辑都在一个地方。
如果无法使用动力学的第二个参数设置事件,那么整个方法就不可能实现。
我需要写一个关于这种方法的说明,以使其更清晰。
所以,我想在此感谢大家。我现在正在使用这种方法完成另一个CDF,即三摆模拟。
答案 0 :(得分:7)
并非Manipulate
之后的所有参数都必须是Control
个对象。你可以在那里放任何你喜欢的东西 - 包括完全自定义的动态控件那么,像
Manipulate[a, {a, None}, {b, None},
Row[{"b= ",Slider[Dynamic[b, (b = #; a = Sin[b]; #)&], {-2 Pi, 2 Pi}]}]]
{a, None}
和{b, None}
确保变量是本地变量,但并非绝对必要。