在动态设置中异步应用连续改进到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}]

如何准备好qualityAqualityB的连续值,并在准备好后将它们的输出附加到显示器上?

奖励点用于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/

10-11 17:54