Wolfram mathematica Mathematica:动态图形的异步增量生成
在动态设置中,对Wolfram mathematica Mathematica:动态图形的异步增量生成,wolfram-mathematica,Wolfram Mathematica,在动态设置中,对图形对象异步应用连续改进的最简单方法是什么(如果在计算过程中输入发生更改,则中止对不需要的结果的计算) 作为一个简单的例子,考虑如下: speed[r_] := Graphics@{Red, Circle[{0, 0}, r]} qualityA[r_] := (Pause[1]; Graphics@{Red, Disk[{0, 0}, r]}) qualityB[r_] := (Pause[1]; Graphics@{Black, Circle[{0, 0}, r]}) Man
图形对象异步应用连续改进的最简单方法是什么(如果在计算过程中输入发生更改,则中止对不需要的结果的计算)
作为一个简单的例子,考虑如下:
speed[r_] := Graphics@{Red, Circle[{0, 0}, r]}
qualityA[r_] := (Pause[1]; Graphics@{Red, Disk[{0, 0}, r]})
qualityB[r_] := (Pause[1]; Graphics@{Black, Circle[{0, 0}, r]})
Manipulate[Show[
ControlActive[speed[r], {qualityA[r], qualityB[r]}],
PlotRange -> {{-1, 1}, {-1, 1}}
], {{r, .5}, 0, 1}]
如何连续评估qualityA
和qualityB
,并在显示器准备就绪时将其输出附加到显示器上
取消对不需要的结果的评估,并允许对部分结果进行多次计算,以便在释放控件后,我将看到例如,{qualityA[r]}
然后是{qualityA[r],qualityB[r]}
,最后是{qualityA2[r],qualityB[r]}
真是个好问题
我可能忽略了一个更简单的方法。当涉及到动态时,通常会有一个。。。但我的建议是:
DynamicModule[{quality = 0, exprs = {}},
Manipulate[
Show[
ControlActive[
exprs = {}; quality = 0; Graphics@{Red, Circle[{0, 0}, r]},
Switch[quality,
0, Pause[1]; quality = 1;
AppendTo[exprs, Graphics@{Red, Disk[{0, 0}, r]}],
1, Pause[1]; quality = 2;
AppendTo[exprs, Graphics@{Black, Circle[{0, 0}, r]}],
_, r];
exprs
],
PlotRange -> {{-1, 1}, {-1, 1}}],
{{r, .5}, 0, 1}
]
]
首先,我们定义一些控制越来越高质量图形的变量:quality
(从0到最高质量,在本例中为2)和exprs
(要显示的表达式列表,如示例所示)
现在注意ControlActive的两种情况下发生的情况:
当ControlActive启动时,结果与您的结果相同,只是我们借此机会重置与“高质量”图形相关的质量
和exprs
当ControlActive处于非活动状态时,动态表达式的计算结果为
code; exprs
此表达式具有以下键属性
每次返回列表exprs
每次计算code
时,它都会通过在exprs
中添加一些内容来改进图形
每次计算code
时,至少一个包含在代码中的词汇变量;expr
(例如质量
)已更改。这意味着Dynamic将继续,一次又一次地评估我们的动态表达式,直到
最后,code
在没有任何包含在代码中的词汇变量的情况下进行计算;exprs
正在更改。这意味着Dynamic将停止重新评估
最终评估在词汇上包含r
。(通过开关中其他无用的默认情况,\ur
)这对于使滑块仍然触发更新非常重要
试试看,让我知道这是否适合你
编辑:您使用的Mathematica的$Version是什么?我在上面代码的行为中看到了一些版本依赖性
编辑2:我问了一位动力学专家,他找到了一个更好的方法,我将在另一个回答中对此进行描述。我的同事Lou,一位动力学专家,提出了这个简洁的答案:
Manipulate[
ControlActive[
Graphics[{LightRed, Circle[{0, 0}, r]},
PlotRange -> {{-1, 1}, {-1, 1}}],
DynamicModule[{exprs = {Red, Circle[{0, 0}, r]}, rr = r},
Graphics[Dynamic[exprs], PlotRange -> {{-1, 1}, {-1, 1}}],
Initialization :> (Pause[1];
AppendTo[exprs, {Red, Disk[{0, 0}, rr]}]; Pause[1];
AppendTo[exprs, {Black, Circle[{0, 0}, rr]}]),
SynchronousInitialization -> False]], {{r, 0.5}, 0, 1}]
工作原理:
当ControlActive处于非活动状态时,动态表达式的结果是一个DynamicModule
。用于优化图形的代码包含在此DynamicModule的初始化
选项中。SynchronousInitialization->False
使该初始化异步运行
在DynamicModule中重命名rr=r
有两个目的。首先,它使结果始终依赖于操纵变量r
。第二,您可以检查rr!=r
要确定用户是否在初始化期间移动了滑块并提前中止,以节省计算时间:
Manipulate[
ControlActive[
Graphics[{LightRed, Circle[{0, 0}, r]},
PlotRange -> {{-1, 1}, {-1, 1}}],
DynamicModule[{exprs = {Red, Circle[{0, 0}, r]}, rr = r},
Graphics[Dynamic[exprs], PlotRange -> {{-1, 1}, {-1, 1}}],
Initialization :> (If[rr =!= r, Abort[]]; Pause[1];
AppendTo[exprs, {Red, Disk[{0, 0}, rr]}]; If[rr =!= r, Abort[]];
Pause[1]; AppendTo[exprs, {Black, Circle[{0, 0}, rr]}]),
SynchronousInitialization -> False]], {{r, 0.5}, 0, 1}]
我希望这能有所帮助。谢谢你,安德鲁!这看起来很像我想要的想法。不幸的是,它对我来说不是很好(v8.0,64位OS-X):第一次移动发行版是好的,但随后滑块停止跟随,接下来一切都停止了。。。和往常一样,对于动力学,我不知道出了什么问题:)这个我不能打破!我真的很期待你的第一个工作-但正如前面提到的,它死在“猴子测试”。这个我可以随心所欲地摆弄,只是一直按计划行事。非常感谢您的关注!