Wolfram mathematica 圆/角滑块
A让我想起了不久前我试图编写的一些代码。其目的是制作一个Wolfram mathematica 圆/角滑块,wolfram-mathematica,Wolfram Mathematica,A让我想起了不久前我试图编写的一些代码。其目的是制作一个圆形滑块[]对象,该对象可用于动态对象中类似角度的变量 我的解决方案的框架(如下)来自教程中定义的valuethumbsloider[]。主要区别在于,在valuethumbslaider[]中,滑块的值和LocatorPlane[]的位置是相同的,而在我的CircularSlider[]中,它们不是相同的-这会导致问题 第一个问题是移动滑块不会更改滑块值。这是通过使用:(x=#/Abs[Complex@@@#])和中的第二个参数修复的 这
圆形滑块[]
对象,该对象可用于动态对象中类似角度的变量
我的解决方案的框架(如下)来自教程中定义的valuethumbsloider[]
。主要区别在于,在valuethumbslaider[]
中,滑块的值和LocatorPlane[]
的位置是相同的,而在我的CircularSlider[]
中,它们不是相同的-这会导致问题
第一个问题是移动滑块不会更改滑块值。这是通过使用:(x=#/Abs[Complex@@@#])和
中的第二个参数修复的
这反过来会导致一个问题,即如果从外部设置滑块(t
)的值,它将立即恢复到以前的值。这是通过保留旧值(t0
)并与t
进行比较来解决的。如果它们不匹配,则假定t已更改,因此定位器
位置x
将更新到其新位置
CircularSlider[t_] := CircularSlider[t, {0, 1}];
CircularSlider[Dynamic[t_], {min_, max_}] /; max > min :=
With[{d = (max - min)/(2. Pi)},
DynamicModule[{td = t/d, x, t0}, x = {Cos[td], Sin[td]};
LocatorPane[
Dynamic[If[!NumberQ[t], t = min; x = {Cos[td], Sin[td]}];
If[t != t0, t0 = t; x = {Cos[td], Sin[td]}];
t = Mod[Arg[Complex @@ x] d, max, min]; t0 = t;
x, (x = #/Abs[Complex @@ #]) &],
Graphics[{AbsoluteThickness[1.5], Circle[],
Dynamic[{Text[NumberForm[t, {3, 2}], {0, 0}]}]}],
ImageSize -> Small]]]
所以,我的问题是:有人能把这项工作用上述的方法来解决吗?< /P> < P >至于问题1,我不认为第二个参数使用<代码>动态< /代码>作为KLUGEY——这就是第二个论点的目的。因此,我没有其他解决方案 如果在第一个参数中不将
t
赋值给Dynamic
,则问题2可以避免
考虑到这一点,下面是另一个实现:
CircularSlider2[Dynamic[t_], r:{min_, max_}:{0, 1}] :=
DynamicModule[{scale, toXY, fromXY},
scale = (max - min) / (2. Pi);
toXY[a_?NumberQ] := Through@{Cos, Sin}[a / scale];
toXY[a_] := {1, 0};
fromXY[{x_, y_}] := Mod[Arg[x + I y] scale, max, min];
LocatorPane[
Dynamic[toXY[t], (t = fromXY[#])&],
Graphics[{
AbsoluteThickness[1.5], Circle[],
Dynamic[{Text[NumberForm[t, {3,2}], {0, 0}]}]
}],
ImageSize -> Small
]
]
此版本与原始版本之间唯一的实质性区别在于Dynamic
的第一个参数是一个没有副作用的表达式
编辑 我刚刚在Mathematica 8中偶然发现了这个未记录的实验特性:
DynamicModule[{x = RandomReal[{0, 50}]},
{Experimental`AngularSlider[Dynamic@x], Dynamic@x}
]
我喜欢!我在代码中注意到的另一个问题是,滑块不能有两个链接副本。我喜欢
showinding->True
选项,这是一个非常好的主意。