动态交互问题

时间:2011-07-17 11:32:43

标签: dynamic wolfram-mathematica frontend interactive

我正在尝试使用两个面板,左侧显示图形和两个定位器,右侧是定位器定义的区域中的放大版本。

我试过

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}]

右侧面板不起作用: enter image description here

我的问题是,为什么会这样?正如你所看到的,它抱怨“DensityPlot :: pllim:Range specification {x,-1,0}不是{x,xmin,xmax}的形式。”我觉得这很令人费解。事实上我一般都很困惑。到底是怎么回事?某种范围问题?评估问题?我怎样才能让它发挥作用?这可能很简单,但我从来没有真正理解这个前端的东西。

编辑:事实证明,这个问题是由于我的愚蠢(希望是一时的)急剧增加。正如Simon在评论中指出的那样,删除了两个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}]

做正确的事:

enter image description here

所以,谁知道为什么我在前几次做了以至于它不起作用。

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

1 个答案:

答案 0 :(得分:5)

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

创建错误的原因是因为绘图的范围应为{x, xmin, xmax} xSymbol以及xminxmax的格式数字。在列表中包裹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的单元格菜单或快捷方式,也可以看到这一点 - 您还可以查看错误消息的基础表达式并查看{{1}在那里建设。也可以DynamicBox删除Unprotect的{​​{1}}定义,但这会破坏Mathematica中的大多数动态功能......


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

MakeBoxes

output of the above