Fwd: Generating Two Unit Orthogonal Vectors to a 3D Vector
- To: mathgroup at smc.vnet.net
- Subject: [mg36374] Fwd: [mg36352] Generating Two Unit Orthogonal Vectors to a 3D Vector
- From: Garry Helzer <gah at math.umd.edu>
- Date: Wed, 4 Sep 2002 02:56:28 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
>
> OrthogonalUnitVectors::usage = "OrthogonalUnitVectors[v:{_,_,_}] will
> return
> two unit vectors orthogonal to each other and to v."
>
> You can assume that v is nonzero.
>
> David Park
> djmp at earthlink.net
> http://home.earthlink.net/~djmp/
Well the Mathematica routine cannot be more elegant than the
mathematics. There are an infinite number of solutions and so an
arbitrary choice must be made.
I will omit the unit condition because orthogonal sets of integral
vectors are useful in examples and exercises --and I prefer to do
graphics in a projective context where "orthogonal" is well defined but
"unit" is not. For unit vectors just map the output with something like
#/Sqrt[#.#]&.
The vector v=(a1,a2,a3) is nonzero if and only if at most one of the
vectors (a2,-a1,0), (a3,0,-a1), or (0,a3,-a2) is zero. These vectors
are all orthogonal to v. But which one to choose? For numerical
stability we should probably take the vector largest in some norm. The
1-norm, Plus@@Abs[#]&, is easy to compute. Having picked the second
vector find the third with a cross product. This assures a right-handed
system.
OrthogonalVectors[v : {a1_, a2_, a3_}] :=
With[{w =
First[Sort[{{a2, -a1, 0}, {a3, 0, -a1}, {0, a3, -a2}},
OrderedQ[{Plus @@ Abs[#2], Plus @@ Abs[#1]}] &]]},
{w, Cross[v, w]}
]
Garry Helzer
Department of Mathematics
University of Maryland
1303 Math Bldg
College Park, MD 20742-4015