[Date Index]
[Thread Index]
[Author Index]
Re: Eternal Trouble with Dynamic: fishing for tips on my
*To*: mathgroup at smc.vnet.net
*Subject*: [mg129520] Re: Eternal Trouble with Dynamic: fishing for tips on my
*From*: Brentt <brenttnewman at gmail.com>
*Date*: Sat, 19 Jan 2013 01:18:10 -0500 (EST)
*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com
*Delivered-to*: l-mathgroup@wolfram.com
*Delivered-to*: mathgroup-newout@smc.vnet.net
*Delivered-to*: mathgroup-newsend@smc.vnet.net
*References*: <20130118055133.1B044687E@smc.vnet.net>
That is exactly what I needed. I'd blindly fudged around the code and got
it working but didn't really understand what the issue was until reading
this.
I think had I been thinking of "interpol" as a function I probably wouldn't
have had the problem. So I learned a couple things here, thank you.
On Fri, Jan 18, 2013 at 6:38 AM, John Fultz <jfultz at wolfram.com> wrote:
> The Big Trouble from your code comes down to your doing:
>
> Show[{Graphics[=85], Dynamic[=85]}]
>
> This is trouble for the same reason that something like this would be
> trouble:
>
> f[x] + Dynamic[g[x]]
>
> Show, like Plus, is a kernel function. It takes two Graphics objects and
> combines them into a single Graphics object. It doesn't know what to do
> with an argument of Dynamic. So, at the simplest level, you'll need to
> remove Dynamic from the 'interpol' definition (since Show doesn't
> understand Dynamic) and wrap it around the Show (to force Show to
> re-evaluate every time its contents update).
>
> So why is this different from Graphics? Graphics[{Dynamic[=85]}] works
> because Graphics doesn't need to evaluate its content. All Graphics does=
,
> when viewed as an output, is to display the content on-screen. I.e., if
> one were to evaluate=85
>
> Graphics[{obj1, obj2, obj3}]
>
> The result of that evaluation would be Graphics[{obj1, obj2, obj3}]. Wha=
t
> turns it into an onscreen graphic isn't the evaluation, but the act of
> displaying the result=85or in Mathematica parlance, "typesetting" the
> graphic. Compared with Show where the expected output of
>
> Show[{obj1, obj2, obj3}]
>
> is Graphics[{some stuff pulled from obj1/2/3}, some options pulled form
> obj1/2/3]
>
> Does that make sense?
>
> Now that's enough to make your example work, but I also recommend that yo=
u
> turn your 'interpol' definition into a function definition. E.g.,
> something like:
>
> DynamicModule[{r = {{0, 0}}, interpol},
> interpol[x_] :=
> If[Length[x] >= 3, Graphics[{Circle[Last[x], 1/Length[x]]}], {}];
> EventHandler[
> Dynamic@
> Show[{Graphics[{Line[Dynamic[r]]}], interpol[r]},
> PlotRange -> ({{-1, 1}, {-1, 1}})], {"MouseDragged" :> (r =
> DeleteCases[AppendTo[r, MousePosition["Graphics"]], None])}]]
>
> John Fultz
> jfultz at wolfram.com
> User Interface Group
> Wolfram Research, Inc.
>
>
>
> On Jan 17, 2013, at 11:51 PM, Brentt <brenttnewman at gmail.com> wrote:
>
> >
> > Hi, everytime I think I have Dynamic down it seemingly inexplicably
> breaks.
> > I'd much appreciate if I could step through the process that leaves me
> with
> > code that, with one small change, just stops working. (Maybe some
> designers
> > might get something out of seeing the coding process of an idiot?)
> >
> > So I want to draw a set of points on a graphic and then show a
> dynamically
> > updated interpolating function for those points. This is my interpolati=
ng
> > function, having this dynamically update upon drawing a set of points i=
n
> > the graphic is the goal:
> >
> >
> > parametricInterpolation[param_, pointList_] :=
> >> Function[{t},
> >> Function[{f}, f[t]] /@
> >> Quiet[(ListInterpolation /@ Transpose[pointList])]][param];
> >>
> >
> > The function works if I take a random set of points. So I set it aside =
to
> > get the dynamic interface working using a more simple function in its
> place
> > (just so I know if any problems arise, which they have, it has nothing
> > within the above slightly complicated function. )
> >
> > Ok, so here is where I start. The point set are to be drawn when the
> mouse
> > is dragged on the graphic. To keep the code as simple as possible I sta=
rt
> > with a point at the origin:
> >
> > DynamicModule[
> >> {r = {{0, 0}}, interpol = {}},
> >>
> >> interpol =
> >> Dynamic@If[Length[r] >= 3, Circle[Last[r], 1/Length[r]], {}];
> >> EventHandler[
> >> Show[
> >> {
> >> Graphics[{Line[Dynamic[r]]}],
> >> Graphics[{interpol}]
> >> },
> >> PlotRange -> ( {
> >> {-1, 1},
> >> {-1, 1}
> >> } )
> >> ],
> >> {"MouseDragged" :> (r =
> >> DeleteCases[AppendTo[r, MousePosition["Graphics"]], None])}]
> >> ]
> >>
> >
> >
> > The variable interpol is going to eventually hold my interpolating
> > function. Since it needs at least 3 points to work properly, I have the
> > conditional so it need not evaluate until at least 3 points are drawn.
> The
> > Circle[Last[r], 1/Length[r]] I'm using as a test function in the
> > interpolating function's place. (it simply draws a circle which shrink=
s
> as
> > function of the the number of points).
> >
> > Code works so far. But the problem is I need the interpolating function
> to
> > be plotted using ParametricPlot. I need to replace Graphics[{Interpol}]
> > with a ParametricPlot.
> >
> > Now this seems like it should be a rather simple step. But alas, no suc=
h
> > luck. My apparently naive approach is to have interpol hold a graphics
> > object, and then use that as an element in Show's list argument. This
> way,
> > if it would work for the simpler function which draws the shrinking
> circle,
> > it would just be a matter of replacing this with a ParametricPlot which
> > plots my interpolation function. But the code breaks before I even get
> > there. Here is the seemingly small step that breaks the code
> >
> > DynamicModule[
> >> {r = {{0, 0}}, interpol = {}},
> >>
> >> interpol =
> >> Dynamic@If[Length[r] >= 3, Graphics[{Circle[Last[r], 1/Length[r]]}]=
,
> >> Graphics[{}]];
> >> EventHandler[
> >> Show[
> >> {
> >> Graphics[{Line[Dynamic[r]]}],
> >> interpol
> >> },
> >> PlotRange -> ( {
> >> {-1, 1},
> >> {-1, 1}
> >> } )
> >> ],
> >> {"MouseDragged" :> (r =
> >> DeleteCases[AppendTo[r, MousePosition["Graphics"]], None])}]
> >> ]
> >>
> >
> >
> > With the result
> >
> > Show::gcomb: Could not combine the graphics objects in Show[{\!\(\*
> > GraphicsBox[LineBox[Dynamic[r$4494]]]\),\!\(\*
> > GraphicsBox[{}]\)},PlotRange->{{-1,1},{-1,1}}]. >>
> >
> >
> > I'm not sure what to make of the error message. It seems like what I di=
d
> > should work. I'm just passing a graphics object instead of an argument
> for
> > Graphics and I'm not sure why should that be a problem? Is there
> something
> > about Graphics that behaves differently that other functions I suppose,
> but
> > I haven't been able to discern what that is. Any tips would be greatly
> > appreciated (whether it is about this code in particular, or anything
> about
> > the process. And please forgive me if I seem thick, I'm an undergraduat=
e
> > mathematics major, but not a terribly good one. This isn't for school
> work,
> > I'm just trying to figure out Mathematica to explore ideas I've learned
> > about. I feel like I have a good sense of how it works except when it
> comes
> > to this Dynamic functionality.)
> >
> >
>
>
Prev by Date:
**Re: Saving mov in v9**
Next by Date:
**Solid State Disk to boost Mathematica performance**
Previous by thread:
**Re: Eternal Trouble with Dynamic: fishing for tips on my coding process?**
Next by thread:
**Needing a Random List of Non-repeating Values whose Range and Length**
| |