A недавний вопрос SO напомнил мне некоторый код, который я пытался написать некоторое время назад.Цель состоит в том, чтобы создать объект CircularSlider[]
, который можно использовать для угловых переменных в динамических объектах.
Основа для моего решения (ниже) взята из ValueThumbSlider[]
, определенного в AdvancedФункциональность манипулирования учебник.Основное отличие состоит в том, что в ValueThumbSlider[]
значение ползунка и положение LocatorPlane[]
- это одно и то же, в то время как в моем CircularSlider[]
они не совпадают - и это приводит к проблемам.
Первая проблема заключается в том, что перемещение Locator
не изменит значение ползунка.Это исправлено с помощью 2-го аргумента в Dynamic
: (x = #/Abs[Complex @@ #]) &
.
Это, в свою очередь, приводит к проблеме, заключающейся в том, что при внешнем задании значения ползунка (* 1023)*) извне он немедленно вернется к своему предыдущему значению.Это исправлено путем сохранения старого значения (t0
) и сравнения с t
.Если они не совпадают, то предполагается, что t изменилось, и поэтому позиция Locator
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]]]
![alt text](https://i.stack.imgur.com/QN3lD.png)
Итак, мой вопрос: кто-то может заставить это работать без вышеупомянутых кладджей?