在动态设置中异步应用连续改进到Graphics
对象的最简单方法是什么(如果在计算输入时改变了它们,则放弃不需要的结果的评估)?
举一个简单的例子,考虑一下:
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
的连续值,并在准备好后将它们的输出附加到显示器上?奖励点用于
Abort
'评估不需要的结果,并允许多次计算一部分结果,因此在释放控件后,我会看到例如{qualityA[r]}
然后是{qualityA[r],qualityB[r]}
,最后是{qualityA2[r],qualityB[r]}
。 最佳答案
我的同事Lou是Dynamic的专家,他提出了一个简洁的答案:
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的Initialization
选项中。 SynchronousInitialization -> False
使此初始化异步运行。在DynamicModule中重命名
rr = r
有两个目的。首先,它使结果始终取决于Manipulate变量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}]
我希望这有帮助。
关于wolfram-mathematica - Mathematica : Asynchronous incremental generation of dynamical graphics,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5087443/