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