MathGroup Archive 1993

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

Search the Archive

Re: Help: how to disp. 3-D vectors

  • To: mathgroup at yoda.physics.unc.edu
  • Subject: Re: Help: how to disp. 3-D vectors
  • From: villegas
  • Date: Wed, 6 Oct 93 08:01:07 -0500

> I am trying to display three data sets, a 3-D vector (v) and
> two scalars (a and b), all three given for a set of points in
> 3-D space. My data looks something like:
> 

> data = { {{x0,y0,z0}, {vx0,vy0,vz0}, a0, b0},
>          {{x1,y1,z1}, {vx1,vy1,vz1}, a1, b1},
>          ...
>          {{xi,yi,zi}, {vxi,vyi,vzi}, ai, bi},
>          ... }
>          

> I would like to have a 3-D display with an arrow at each point
> {xi, yi, zi}, the arrow being parallel with vi and its length
> and colour representing the values of ai and bi respectively. 

> I have tried using ListPlotVectorField3D which almost does the
> job, but not quite. Am I missing something, or perhaps just asking
> for too much?

New in 2.2 is the package Graphics`Arrow`, which defines a new graphics
primitive called 'Arrow' (analogous to the familiar 'Line', 'Polygon',
et al) using some PostScript features introduced in 2.2.  After
loading the package

Needs["Graphics`Arrow`"]

we can look up the usage of Arrow:

? Arrow

Arrow[start, finish, (opts)] is a graphics primitive representing an
   arrow starting at start and ending at finish.

Since Arrow takes the starting and ending point of the arrow, we can
apply a function across your list of arrow-specifications to produce
the Arrow objects.  If we use Mathematica's pure functions, then we
can represent the different parts of a general arrow-specification
{{xi,yi,zi}, {vxi,vyi,vzi}, ai, bi} with Slot symbols #1 through #4:

#1 = {xi, yi, zi}
#2 = {vxi,vyi,vzi}
#3 = ai
#4 = bi

Using this notation, the desired Arrow object would be

Arrow[#1, #1 + #3 * #2/(#2 . #2)]   (* assuming #2 is not a unit vector *)

and the color, as determined by element 4, bi, is put into a list with the
Arrow.  Say bi is a value intended for the Mathematica Hue function:

{ Hue[#4], Arrow[#1, #1 + #3 * #2/(#2 . #2)] }

If we want, we can give options inside the Arrow to control features of
the arrowhead.  The options are described in the Technical Report:  _Guide
to Standard Mathematica Packages_, and are summarized in the usage messages
for the package.

   Let's make a sample list of arrow-specifications and show how to
form and render the Arrows.  In this example, I used direction vectors,
so I did not need to divide #2 by the norm (#2 . #2) as above.  But your
data list might need the more general form above.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

vectorSpecs =
  Table[{{Cos[t], Sin[t]}, {Cos[t], Sin[t]}, 1/3 Sin[8 t],
    1/2 + 1/3 Sin[8 t]}, {t, 0, (2Pi - Pi/50), Pi/50}];

arrows =
  Apply[ {GrayLevel[#4],
    Arrow[#1, #1 + #3 * #2, HeadLength->1/50] }&, vectorSpecs, {1} ];

Show[Graphics[arrows, Axes->True, AspectRatio->Automatic]]


If you have a color screen, then here is a somewhat prettier variation:


vectorSpecsColor =
  Table[{{Cos[t], Sin[t]}, {Cos[t], Sin[t]}, 1/3 Sin[8 t],
    2/3 + 1/3 Sin[8 t]}, {t, 0, (2Pi - Pi/50), Pi/50}];

arrowsColor =
  Apply[ {Hue[#4],
    Arrow[#1, #1 + #3 * #2, HeadLength->1/50] }&, vectorSpecsColor, {1} ];

Show[Graphics[arrowsColor, Axes->True, AspectRatio->Automatic]]

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Robby Villegas





  • Prev by Date: Incorporating NeXT Notebooks into LaTeX
  • Next by Date: Re: Help: how to disp. 3-D vectors
  • Previous by thread: Incorporating NeXT Notebooks into LaTeX
  • Next by thread: Re: Help: how to disp. 3-D vectors