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):第一次移动发行版是好的,但随后滑块停止跟随,接下来一切都停止了。。。和往常一样,对于动力学,我不知道出了什么问题:)这个我不能打破!我真的很期待你的第一个工作-但正如前面提到的,它死在“猴子测试”。这个我可以随心所欲地摆弄,只是一直按计划行事。非常感谢您的关注!