недавний вопрос SO напомнил мне о некотором коде, который я пытался написать некоторое время назад. Цель состоит в том, чтобы создать объект CircularSlider []
, который можно было бы использовать для угловых переменных в динамических объектах.
Основа моего решения (ниже) взята из ValueThumbSlider []
, определенный в учебном пособии Расширенные функции управления . Основное отличие состоит в том, что в ValueThumbSlider []
значение ползунка и положение LocatorPlane []
совпадают, а в моем CircularSlider []
их нет - и это приводит к проблемам.
Первая проблема заключается в том, что перемещение Локатора
не изменит значение ползунка. Это исправлено с помощью второго аргумента в Dynamic
: (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]]]
Итак, мой вопрос: может ли кто-нибудь сделать это работать без вышеуказанных кладжей?