// // Returns a vector that is orthogonal to A (but of arbitrary length). // Vector OrthogonalTo( const Vector &A ) { Vector B( A.Size() ); double c = 0.5 * SupNorm( A ); if( A.Size() < 2 ) { // Just return the zero-vector. } else if( c == 0.0 ) { B(0) = 1.0; } else for( register int i = 0; i < A.Size(); i++ ) { if( Abs( A(i)) > c ) { int k = ( i > 0 ) ? i - 1 : i + 1; B(k) = -A(i); B(i) = A(k); break; } } return B; }
/*-------------------------------------------------------------------------* * O R T H O G O N A L T O * * * * Returns a vector that is orthogonal to A (but of arbitrary length). * * * *-------------------------------------------------------------------------*/ Vec3 OrthogonalTo( const Vec3 &A ) { float c = 0.5 * SupNorm( A ); if( c == 0.0 ) return Vec3( 1.0, 0.0, 0.0 ); if( c <= Abs(A.X()) ) return Vec3( -A.Y(), A.X(), 0.0 ); if( c <= Abs(A.Y()) ) return Vec3( 0.0, -A.Z(), A.Y() ); return Vec3( A.Z(), 0.0, -A.X() ); }