MathGroup Archive 2010

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Manipulate with variable number of controls

  • To: mathgroup at smc.vnet.net
  • Subject: [mg107903] Re: Manipulate with variable number of controls
  • From: Albert Retey <awnl at gmx-topmail.de>
  • Date: Tue, 2 Mar 2010 07:53:21 -0500 (EST)
  • References: <hm6ts0$ggb$1@smc.vnet.net>

Am 25.02.2010 23:33, schrieb Dominic:
> Hi,
> 
> Can I set up a Manipulate with a variable number of controls?  The code 
> below draws 4 circles and line segments between them at the angles given 
> by the slider values.  As you can see, I had to hard-code the function 
> for the lines, and the number of controls given by the size of rtable.  
> Is is possible to dynamically construct this Manipulate based on the 
> size of rtable?  I noticed if I try to build a control outside of 
> Manipulate such as mycontrol1={"t1",0,2 PI}, and then use mycontrol1 
> inside of Manipulate, it doesn't work.  Also, I use 
> LocalizeVariales->False since I then go on to use the values of the 
> angles (t1,t2, ...) in the program. 
> 
> Can anybody help me to get this working for arbitrary-size rtable with 
> not more than five entries,  or is Manipulate not capable of dynamically 
> allocating a variable number of controls?

I have seen there is another solution, but here is another version that
doesn't need converting to strings and back. The trick I am using is to
contruct the Manipulate arguments wrapped with Hold and only in the end
apply Manipulate. I also am using the fact that Manipulate accepts
variable definitions like t[1]. Unfortunately that is realized in a way
that makes it necessary to have explicit occurances of t[1],... appear
in the body of the Manipulate, so that is why everything needs to be a
little more complicated that one would wish...

lines[tvals_List] := Table[
  Line[{
    {Re[rtable[[i]]*Exp[I*tvals[[i]]]],
     Im[rtable[[i]]*Exp[I*tvals[[i]]]]},
    {Re[rtable[[i + 1]]*Exp[I*tvals[[i]]]],
     Im[rtable[[i + 1]]*Exp[I*tvals[[i]]]]}
    }],
  {i, Length[tvals]}
  ]

circles[rtable_List] :=
  Table[Circle[{0, 0}, rtable[[n]]], {n, 2, Length[rtable]}];

rtable = Range[0, 5];
Manipulate @@ Replace[With[{
    controls = Hold @@ Table[
       With[{ii = i},
        Hold[{tval[ii], 0, Subscript["t", ii]}, 0, 2 Pi]],
       {i, Length[rtable] - 1}
       ],
    tvals = Table[tval[i], {i, 1, Length[rtable] - 1}]
    },
   Join[
    Hold[Show[Graphics[{lines[tvals], circles[rtable]}]]],
    controls,
    Hold[Axes -> True, PlotRange -> {{-5, 5}, {-5, 5}}]
    ]
   ], Hold[a___] :> List[a], {1}]



  • Prev by Date: Re: CONDITION/DATA ANALYSIS/PLOTS
  • Next by Date: Re: CONDITION/DATA ANALYSIS/PLOTS
  • Previous by thread: Re: Manipulate with variable number of controls
  • Next by thread: Re: Manipulate with variable number of controls