Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Difficulties with LocatorPanel

3 views
Skip to first unread message

David Carraher

unread,
Sep 2, 2010, 2:31:59 AM9/2/10
to
Hi All,

I've been struggling to implement a locator, located at {1,0} that
rescales the x-axis by stretching/shrinking.
I want to use LocatorPane rather than Locator because I eventually to add
another half-dozen locators that have different behaviors and appearance.

The solution in LocatorPane would work more or less like the following
instance of Locator[].
The red and blue points position themselves dynamically as the scale
stretches and shrinks (as desired).
The Locator dynamically rescales the x-axis by stretching and shrinking.
And It is always positioned at {1,0}.

Manipulate[

Graphics[{
Locator[Dynamic[p, (p = Scaled[{#[[1, 1]], .5}]) &], ImageSize -> 25],
{PointSize -> Large, Blue, Point[{.5, 0}], Red, Point[{2.5, 0}]}},
ImageSize -> {350, 150},
AspectRatio -> 1/4,
PlotRange -> {{0, maxX = Dynamic[Abs[1/p[[1, 1]]]]}, {-6, 6}}, Axes ->
True],
{{p, Scaled[{0.01, 0.5}]}, ControlType -> None}

]


The LocatorPane, In addition to having these features, and the inherent
ability to hold several locators, would:
not be dependent on Scale[], because some locators will work with the
Coordinate values themselves. (unless LocatorPanel can work with both
scaled and regular locators.)

Here's the best I've been able to come up with:

Manipulate[
Dynamic@Grid[{
{LocatorPane[Dynamic[pLoc],
Graphics[{
{PointSize -> Large, Blue, Point[{.5, 0}], Red, Point[{2.5,
0}]}},
ImageSize -> {350, 150},
AspectRatio -> 1/4,
Axes -> True,
PlotRange -> {{0, 1/Dynamic[pLoc[[1, 1]]]}, {-6, 6}}],
(*Allowable roving of the Locators *) {{{1/20, 0}, {20, 0}}},

(*Appearance of Locatos *)
Appearance -> { Framed["x1", Background -> LightBlue,
RoundingRadius -> 3, FrameMargins -> 1]}]} }],

(*Locator*)
{{x1, {1, 0}}, ControlType -> None},
{{pLoc, {x1}}, ControlType -> None},

Alignment -> {Center, Center} ]


I read the documentation carefully and worked on it until I can get no
further ahead by myself. But as you shall see, the locator in LocatorPane
moves to positions other than {1, 0}.
I'm not sure whether my problem lies with the mathematics or with
Mathematica.

Any help would be appreciated.


thanks,

David Carraher

Chris Young

unread,
Jan 25, 2012, 7:14:27 AM1/25/12
to
Here, I'm doing my best to emulate scaling of an axis by dragging a
Locator. Probably a better approach would be to use sliders to set the
actual PlotRange parameters directly. However, provided we remember
that we've essentially got a "fake" x-axis here, it's good for a
hands-on illustration of scaling of function plots.

Since Show doesn't tolerate more than one setting of the ranges of the
axes per plot, it's impossible to superimpose plots with two axes that
way. Maybe there's another way to do that?


For some reason, whatever I do I can't get Plot to work with the
"scale" variable here. I put in the P[[1]] directly and got the scaled
plotting to work that way, but it only goes by one increment at a time.
You can't drag continuously, the way you can if you omit the plotting.

http://home.comcast.net/~cy56/Mma/AxisScaledByLocator.nb
http://home.comcast.net/~cy56/Mma/AxisScaledByLocatorPic1.png
http://home.comcast.net/~cy56/Mma/AxisScaledByLocatorPic2.png

DynamicModule[
{
P = {1, 0},
scale, (* taken from the x-coordinate of P[[1]] *)
xAxis
},

scale = Dynamic @ P[[1]];

Dynamic @ LocatorPane[
Dynamic @ P,

Show[
Graphics[
{
Black, AbsoluteThickness[0.5],
Line[{{0, 0}, {10 * scale, 0}}],

With[{y1 = -0.1, y2 = 0.1},
Table[
{Line[{{k scale, y1}, {k scale, y2}}],
Text[k, {k scale, 3 y1}]},
{k, 1, 10}]]
},
ImageSize -> 72 * {10, 1},
AspectRatio -> 2/20,
Axes -> {True, True},
AxesStyle -> {LightGray, Black},
PlotRange -> {{0, 20}, {-1, 1}}
],

Plot[{Sin[x], Sin[x/P[[1]]]}, {x, 0, 20},
PlotStyle -> {LightGray, Red}]
],

{{0, 0}, {20, 0}, {0.25, 0}},

Appearance -> {Framed["x1",
Background -> LightBlue,
RoundingRadius -> 3,
FrameMargins -> 1]}
]
]

On 2010-09-02 06:31:59 +0000, David Carraher said:

> DynamicModule[
> {
> P = {1, 0},
> scale, (* taken from the x-coordinate of P[[1]] *)
> xAxis
> },
>
> scale = Dynamic @ P[[1]];
>
> Dynamic @ LocatorPane[
> Dynamic @ P,
>
> Show[
> Graphics[
> {
> Black, AbsoluteThickness[0.5],
> Line[{{0, 0}, {10 * scale, 0}}],
>
> With[{y1 = -0.1, y2 = 0.1},
> Table[
> {Line[{{k scale, y1}, {k scale, y2}}],
> Text[k, {k scale, 3 y1}]},
> {k, 1, 10}]]
> },
> ImageSize -> 72 * {10, 1},
> AspectRatio -> 2/20,
> Axes -> {True, True},
> AxesStyle -> {LightGray, Black},
> PlotRange -> {{0, 20}, {-1, 1}}
> ],
>
> Plot[{Sin[x], Sin[x/P[[1]]]}, {x, 0, 20},
> PlotStyle -> {LightGray, Red}]
> ],
>
> {{0, 0}, {20, 0}, {0.25, 0}},
>
> Appearance -> {Framed["x1",
> Background -> LightBlue,
> RoundingRadius -> 3,
> FrameMargins -> 1]}
> ]
> ]Hi All,
0 new messages