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