Circular/Angular slider

前端 未结 1 1436
傲寒
傲寒 2021-01-01 02:30

A recent SO question reminded me of some code I tried to write a while back. The aim is to make a CircularSlider[] object that can be used for angle-like variab

相关标签:
1条回答
  • 2021-01-01 03:12

    As for problem#1, I wouldn't consider the use of the second argument to Dynamic as a kludge -- that is what the second argument is for. Therefore, I don't have an alternative solution for that one.

    Problem #2 can be avoided if you refrain from assigning t in the first argument to Dynamic.

    With this in mind, here is another implementation:

    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
          ]
      ]
    

    The only material difference between this version and the original version is that the first argument to Dynamic is an expresssion that is free of side-effects.


    Edit

    I just stumbled across this undocumented experimental feature in Mathematica 8:

    DynamicModule[{x = RandomReal[{0, 50}]},
      {Experimental`AngularSlider[Dynamic@x], Dynamic@x}
    ]
    

    angular slider

    0 讨论(0)
提交回复
热议问题