Mathematica:动态图形的异步增量生成

Jan*_*nus 9 wolfram-mathematica

什么是连续的改进异步应用到一个最简单的方式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}] 
Run Code Online (Sandbox Code Playgroud)

Mathematica图形

如何评估qualityAqualityB连续,并且其输出追加到显示器时,它已经准备好?

奖励点用于Abort评估不需要的结果,并允许多次计算结果的一部分,以便在释放控制后我会看到,{qualityA[r]}然后 {qualityA[r],qualityB[r]},最后{qualityA2[r],qualityB[r]}.

And*_*lan 5

我的同事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}]
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

当不是ControlActive时,动态表达式的结果是a DynamicModule.用于优化图形的代码包含在Initialization此DynamicModule 的选项中.将SynchronousInitialization -> False使得这个初始化异步运行.

rr = r在DynamicModule中重命名有两个目的.首先,它使结果总是依赖于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}]
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.