Re: Generating Two Unit Orthogonal Vectors to a 3D Vector
- To: mathgroup at smc.vnet.net
- Subject: [mg36370] Re: [mg36352] Generating Two Unit Orthogonal Vectors to a 3D Vector
- From: John Browne <jbrowne at swin.edu.au>
- Date: Tue, 3 Sep 2002 01:41:14 -0400 (EDT)
- Organization: Swinburne University of Technology
- References: <200209020809.EAA15855@smc.vnet.net>
- Reply-to: jbrowne at swin.edu.au
- Sender: owner-wri-mathgroup at wolfram.com
David Park wrote:
> There are many cases in graphics, and otherwise, where it is useful to
> obtain two orthogonal unit vectors to a given vector. I know a number of
> ways to do it, but they all seem to be slightly inelegant. I thought I would
> pose the problem to MathGroup. Who has the most elegant Mathematica
> routine...
>
> OrthogonalUnitVectors::usage = "OrthogonalUnitVectors[v:{_,_,_}] will return
> two unit vectors orthogonal to each other and to v."
>
> You can assume that v is nonzero.
David, here is a solution generating two random vectors:
OrthogonalUnitVectors[v : {_, _, _}] :=
Module[{r, v1, v2}, r = {Random[], Random[], Random[]}; v1 = Cross[v, r];
v2 = Cross[v1, v]; {v1/Sqrt[Dot[v1, v1]], v2/Sqrt[Dot[v2, v2]]}]
Test:
v = {Random[], Random[], Random[]}
{0.864587, 0.727747, 0.669729}
{A,B} = OrthogonalUnitVectors[v]
{{0.279985, -0.808701, 0.517311}, {-0.698881, 0.19773, 0.687363}}
Chop[{A.v, B.v, A.B, A.A, B.B}]
{0, 0, 0, 1., 1.}
John
-- _________________________________
John Browne
School of Engineering and Science
Swinburne University of Technology
John Street, Hawthorn, Victoria, Australia
Quantica phone: +613 9431 4007
Quantica fax: +613 9431 0940
Email: jbrowne at swin.edu.au
- References:
- Generating Two Unit Orthogonal Vectors to a 3D Vector
- From: "David Park" <djmp@earthlink.net>
- Generating Two Unit Orthogonal Vectors to a 3D Vector