Круговой / угловой слайдер

недавний вопрос 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]]]

alt text


Итак, мой вопрос: может ли кто-нибудь сделать это работать без вышеуказанных кладжей?

5
задан Community 23 May 2017 в 12:13
поделиться