gpt4 book ai didi

wolfram-mathematica - Mathematica 中 Manipulate[] 的自定义 Controller

转载 作者:行者123 更新时间:2023-12-04 00:14:55 29 4
gpt4 key购买 nike

我创建了一个函数 test[],如果需要,它也可以是一个符号测试,我正在尝试在操作中实现它。 test[] 看起来像这样:

test[]:=Button["Label",Functionality[]];

如果直接在 Manipulate[] 中使用,这将返回错误,但如果它包含在 Dynamic 或 Evaluate 中,则有效。
Manipulate[content,test[]];

Manipulate::vsform: Manipulate argument test[] does not have the correct form for a variable specification.


Manipulate[content,Dynamic[test[]]]

这个有效
Manipulate[content,Evaluate[test]]

请注意,虽然这有效,但 test 不是函数
Manipulate[content,Evaluate[test[]]]

这适用于我的 Mac,但不适用于我的 PC 工作...

我认为这个问题与 Manipulate 是 HoldAll 有关,但不明白为什么 Dynamic[] 应该解决这个问题。此外, Evaluate[] 只会在某些时候起作用。

那么,为什么需要 Dynamic[] 或 Evaluate[] 呢?查看高级操作教程的自定义 Controller 部分,我没有看到对这个问题的引用,也找不到任何其他地方。

最佳答案

您可以内联 Button而不是使用单独的 test[]功能。否则你最后一个例子,Manipulate[content,Evaluate[test[]]] , 确实在 Mathematica 8 中显示了我机器上的按钮。平台(Windows 或 Mac)之间应该没有区别。

如果您正在做的事情与Manipulate 完全不同默认情况下提供,您可能会发现使用 Dynamic 从头开始​​构建它更方便。 (这是我通常做的)。

下面是如何将一些按钮包含为 Controller 的示例。

首先,在Manipulate里面设置一些东西来显示:

rotate90[{x_, y_}] := {-y, x}

koch[p1_, p2_, n_] := {koch[p1, p1 + (p2 - p1)/3, n - 1],
koch[p1 + (p2 - p1)/3, (p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1],
n - 1], koch[(p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1],
p2 - (p2 - p1)/3, n - 1], koch[p2 - (p2 - p1)/3, p2, n - 1]}

koch[p1_, p2_, 0] := Line[{p1, p2}]

snowflake[n_] :=
Graphics[{koch[{0, 0}, {1, 0}, n],
koch[{1, 0}, {1/2, -Sqrt[3]/2}, n],
koch[{1/2, -Sqrt[3]/2}, {0, 0}, n]}]

然后设置 Manipulate本身:
Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
Style["A Koch snowflake", Bold], Delimiter,
Row[{Button["+", n++], Button["-", n = Max[n - 1, 0]]}]]

Mathematica graphics

这是一个示例,表明即使 Button 也能正常工作在单独的函数中定义:
SetAttributes[paletteButton, HoldRest]
paletteButton[name_, func_] :=
Button[name, func, Appearance -> "Palette"]

Manipulate[snowflake[n], {{n, 2}, ControlType -> None},
Style["A Koch snowflake", Bold], Delimiter,
Evaluate@paletteButton["+", n++]]

正如您在问题中提到的,这里有必要将函数包装在 Evaluate 中。获得内联 Button .否则 Manipulate将无法注意到我们这里拥有的是一个控件而不是一个变量。

关于wolfram-mathematica - Mathematica 中 Manipulate[] 的自定义 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846239/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com