【问题标题】:dynamic interactivity problem动态交互问题
【发布时间】:2011-07-17 11:32:42
【问题描述】:

我试图有两个面板,左边显示一个图形和两个定位器,右边一个是定位器定义的区域中的放大版本。

我试过了

ClearAll[mndpt];
mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}},
   Module[{z, iters},
        iters = 0.;
        z = c;
            While[(iters < maxiter) && (Abs@z < 2),
                iters++;
                z = z^2 + c];
        Sqrt[iters/maxiter]],
   {{z, _Complex}},
   CompilationTarget \[Rule] "C",
   RuntimeOptions \[Rule] "Speed"];

然后做

Manipulate[
 Grid[
  {{DensityPlot[mndpt[x + y*I, 200],
        {x, -2, 1}, {y, -1.5, 1.5},
        PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
     ColorFunction \[Rule] "Rainbow"],
    DensityPlot[mndpt[x + y*I, 200],
        Dynamic@{x, p1[[1]], p2[[1]]}, Dynamic@{y, p1[[2]], p2[[2]]},
        PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
     ColorFunction \[Rule] "Rainbow"]}}],
 {{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}]

然后右侧面板不起作用:

我的问题是,为什么会这样?如您所见,它抱怨“DensityPlot::pllim: Range specification {x,-1,0} 不是 {x, xmin, xmax} 的形式。”我觉得这很令人费解。事实上,我普遍感到困惑。到底是怎么回事?某种范围界定问题?评价问题?我怎样才能让它工作?这可能很简单,但我从来没有真正理解过这些前端的东西。

编辑:事实证明,这个问题是由于我的愚蠢程度(希望是暂时的)急剧增加造成的。正如西蒙在评论中指出的那样,删除两个Dynamics (我为了完成这项工作而盲目地添加了它)使一切正常。也就是说,

    Manipulate[
 Grid[
  {{DensityPlot[mndpt[x + y*I, 200],
        {x, -2, 1}, {y, -1.5, 1.5},
        PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
     ColorFunction \[Rule] "Rainbow"],
    DensityPlot[mndpt[x + y*I, 200],
        {x, p1[[1]], p2[[1]]},{y, p1[[2]], p2[[2]]},
        PlotRange \[Rule] {0, 1}, PlotPoints \[Rule] 80, 
     ColorFunction \[Rule] "Rainbow"]}}],
 {{p1, {-1, -1}}, Locator}, {{p2, {0, 1}}, Locator}]

做正确的事:

所以,谁知道为什么我前几次都做了,结果还是没用。

另一方面,原始案例中的消息,即“DensityPlot::pllim: Range specification {x,-1,0} is not of the form {x, xmin, xmax}。”更令人费解.我认为 Leonid 已经解释过了,也在评论中(简而言之,尝试ClearAttributes[Dynamic, ReadProtected] 然后??Dynamic 你可以看到有一个定义Dynamic/:MakeBoxes[BoxForm`x$_Dynamic,StandardForm]:= 等)。由于我对前端编程的理解可以忽略不计,因此我不会在这里解释它,所以如果有人确实发布了解释这一点的答案,将不胜感激。

【问题讨论】:

  • 删除两个Dynamics,一切正常。
  • @Simon 哇哦,谢谢!我实际上把它们放在那里是因为“它不起作用”,我开始随机添加东西直到它起作用。谁知道我做了什么...将您的评论作为答案,以便我接受。另外,如果你知道为什么Dynamics 搞砸了,我想知道。
  • @Simon 好的,可能是因为Dynamic 具有属性HoldFirst。还是?
  • @acl Dynamic(与许多其他命令一样)通过UpValues 重新定义了MakeBoxes(一旦从Dynamic 中删除ReadProtected 属性,您就可以看到它们)。这也会影响使用和错误消息。
  • @acl 如果 Simon 发布答案,我会很高兴,因为是他回答了这个问题。然后,要么他将我们讨论的某些部分纳入他的答案,要么我可以通过编辑他的答案来做到这一点。

标签: dynamic wolfram-mathematica frontend interactive


【解决方案1】:

正如问题的 cmets 中所讨论的,如果将 Dynamics 从第二个 DensityPlot 的范围中删除,则代码可以正常工作。 Dynamics 通常不需要在 Manipulate 的主体中,因为它会自动包装在动态构造中。虽然,为了更精细地控制表达式更新的哪些部分,使用Dynamic inside of a Manipulate 会很有用。

产生错误的原因是绘图的范围应采用{x, xmin, xmax} 的形式,其中xSymbolxminxmax 数字。将Dynamic 包裹在列表周围会改变头部并破坏情节。

错误不明显的原因是错误信息有点混乱:

范围规范 {x,-1,0} 的形式不是 {x, xmin, xmax}。

表面上看起来很疯狂,但是一旦你意识到(正如 Leonid 所指出的)Dynamic 是一个包装器,它有一个 MakeBoxes 定义,使它在输出到笔记本时不可见。要查看此内容,请查看

In[1]:= FormatValues[Dynamic]
Out[1]= {HoldPattern[MakeBoxes[BoxForm`x$_Dynamic, StandardForm]] :> (DynamicModule; 
           DynamicDump`ControlToBoxes[BoxForm`x$, StandardForm]), 
        <<snip: same but for TraditionalForm>>}

ControlToBoxes 依次创建一个DynamicBox 对象。这也可以通过输入Dynamic[x] 并使用单元格菜单或生成的输出单元格的Show Expression 快捷方式来查看 - 您还可以查看错误消息的基本表达式并查看那里的DynamicBox 构造。也可以使用Unprotect 并删除DynamicMakeBoxes 定义,但这会破坏 Mathematica 中的大部分动态功能...


最后,这是我的代码版本:

mndpt = Compile[{{c, _Complex}, {maxiter, _Integer}},
   Module[{z = c, iters = 0.0},
    While[(iters < maxiter) && (Abs@z < 2), iters++; z = z^2 + c];
    Sqrt[iters/maxiter]], CompilationTarget -> "C", 
   RuntimeOptions -> "Speed"];

opts = Sequence[PlotPoints -> 80, ColorFunction -> "Rainbow", 
   ImageSize -> Medium, ImagePadding -> {{30, 5}, {20, 5}}];

fixed = DensityPlot[mndpt[x + y*I, 200], {x, -2, 1}, {y, -1.5, 1.5}, 
   PlotPoints -> 120, Evaluate[opts]];

Manipulate[Grid[{{fixed, DensityPlot[mndpt[x + y*I, 200],
   {x, p[[1, 1]], p[[2, 1]]}, {y, p[[1, 2]], p[[2, 2]]}, Evaluate[opts]]}}],
 {{p, {{-1, -1}, {0, 1}}}, Locator, ContinuousAction -> False}]

【讨论】:

  • 巧合的是,我几乎是在您提交后立即看到的。看来我在您提交答案 14 秒后赞成并接受了您的答案,我怀疑这一定是一个记录!
  • @acl:这让我赢得了Revival Badge - 懒惰是值得的!
猜你喜欢
  • 2020-11-24
  • 1970-01-01
  • 2011-11-11
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多