MathGroup Archive 2008

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

Search the Archive

Re: Using an locator and Rotating 3D graphics

  • To: mathgroup at smc.vnet.net
  • Subject: [mg92581] Re: Using an locator and Rotating 3D graphics
  • From: "David Park" <djmpark at comcast.net>
  • Date: Tue, 7 Oct 2008 07:03:32 -0400 (EDT)
  • References: <gccheo$s5t$1@smc.vnet.net>

Manipulate is like a set-piece dynamic display. It tries to be very versitle 
but for most custom dynamic presentations it becomes a pain-in-the-neck. It 
is better to learn how to construct your own dynamic presentations. Here is 
more direct code for your display:

Module[
 {pt1 = {1, 0}, pt2 = {0, 1}},
 Row[{
   Graphics[
    {Dynamic@Arrow[{pt1, pt2}],
     Locator[Dynamic[pt1]],
     Locator[Dynamic[pt2]]},
    PlotRange -> 2,
    ImageSize -> 200],
   Dynamic@
    ParametricPlot3D[{Part[pt2 - pt1, 1] Cos[u],
      Part[pt2 - pt1, 2]  Sin[u], u}, {u, 0, 4 Pi},
     PlotRange -> {{-2, 2}, {-2, 2}},
     ColorFunction -> Function[{x, y, z, u}, Hue[u]],
     PlotStyle -> Thick,
     ImageSize -> 350,
     BoxRatios -> {1, 1, 1}]}]
 ]

You could use DynamicModule, but it really isn't necessary here. The 
Locators are confined to the lhs plot and not imposed on the entire display. 
In the code above I bypassed calculating the v variable you used.  Let's 
reintroduce v. Quite often we might have a set of primary dynamic variables, 
such as pt1 and pt2 here, which are manipulated by the mouse or sliders or 
other dynamic elements, and a set of dependent dynamic variables that depend 
on the primary variables, such as v here. We can handle this situation as in 
the following code. Here we use the two argument form of Dynamic and when a 
primary dynamic variable is adjusted the routine calcAll is called to 
calculate all the dependent quantities (only v in this case). I've also made 
some stylistic changes to the display.

Module[
 {(* Primary dynamic variables *)
  pt1 = {1, 0}, pt2 = {0, 1},
  (* Dependent dynamic variable *)
  v,
  (* Other variables *)
  calcAll},

 calcAll[p1_, p2_] := (v = p2 - p1);

(* Initialize dependent variables *)
 calcAll[pt1, pt2];

 (* Display *)
 Panel[
  Row[{
    Graphics[
     {Arrowheads[.1],
      Dynamic@Arrow[{pt1, pt2}],
      Locator[Dynamic[pt1, (pt1 = #; calcAll[pt1, pt2]) &],
       Graphics[{AbsolutePointSize[8], Point[{0, 0}]},
        ImageSize -> 10]],
      Locator[Dynamic[pt2, (pt2 = #; calcAll[pt1, pt2]) &], None]},
     PlotRange -> 2,
     ImageSize -> 200],
    Dynamic@
     ParametricPlot3D[{v[[1]] Cos[u], v[[2]]  Sin[u], u}, {u, 0,
       4 Pi}, PlotRange -> {{-2, 2}, {-2, 2}},
      ColorFunction -> Function[{x, y, z, u}, Hue[u]],
      PlotStyle -> Thick,
      Axes -> False,
      SphericalRegion -> True, RotationAction -> Clip,
      ImageSize -> 350,
      Boxed -> False,
      BoxRatios -> {1, 1, 1}]}],
  Style["Custom Dynamics", 16]]
 ]

-- 
David Park
djmpark at comcast.net
http://home.comcast.net/~djmpark/


"KB" <KennethLeeBaker at gmail.com> wrote in message 
news:gccheo$s5t$1 at smc.vnet.net...
> When I try to use locators as inputs to 3D graphics, I end up not
> being able to rotate 3d graphics.  Clicking on the graphic moves the
> nearest locator rather than the graphic.  Switching to a collection of
> 2D sliders works in a pinch, but does not achieve the desired effect.
> Here is an example:
>
> Manipulate[v = pt2 - pt1;
> {Graphics[Arrow[{pt1, pt2}], PlotRange -> 2],
>  ParametricPlot3D[{v[[1]] Cos[u], v[[2]] Sin[u], u}, {u, 0, 4 Pi},
>   PlotRange -> {{-2, 2}, {-2, 2}},
>   ColorFunction -> Function[{x, y, z, u}, Hue[u]],
>   PlotStyle -> Thick]}, {{pt1, {0, 1}}, Locator},   {{pt2, {1, 0}},
>  Locator}]
>
>
> Any ideas?
> 



  • Prev by Date: Re: integration
  • Next by Date: Re: an interesting problem of supplying boundary condition for a
  • Previous by thread: Using an locator and Rotating 3D graphics
  • Next by thread: Why is Mathematica assuming k==l and how do I make it not to?