/*************************************************************************** * Vec4.C * * * * Basic operations on 3-dimensional vectors. This special case is useful * * because many operations are performed inline. * * * * HISTORY * * Name Date Description * * * * walt 6/26/07 Edited Vec4 to make this new class * * arvo 10/27/94 Reorganized (removed Col & Row distinction). * * arvo 06/14/93 Initial coding. * * * *--------------------------------------------------------------------------* * Copyright (C) 1994, James Arvo * * * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation. See http://www.fsf.org/copyleft/gpl.html * * * * This program is distributed in the hope that it will be useful, but * * WITHOUT EXPRESS OR IMPLIED WARRANTY of merchantability or fitness for * * any particular purpose. See the GNU General Public License for more * * details. * * * ***************************************************************************/ #include #include #include "ArvoMath.h" #include "Vec4.h" #include "form.h" namespace ArvoMath { float Normalize( Vec4 &A ) { float d = Len( A ); if( d > 0.0 ) { double c = 1.0 / d; A.X() *= c; A.Y() *= c; A.Z() *= c; A.W() *= c; } return( d ); } double Angle( const Vec4 &A, const Vec4 &B ) { double t = LenSqr(A) * LenSqr(B); if( t <= 0.0 ) return 0.0; return ArcCos( (A * B) / sqrt(t) ); } Vec4 Min( const Vec4 &A, const Vec4 &B ) { return Vec4( Min( A.X(), B.X() ), Min( A.Y(), B.Y() ), Min( A.Z(), B.Z() ), Min( A.W(), B.W() ) ); } Vec4 Max( const Vec4 &A, const Vec4 &B ) { return Vec4( Max( A.X(), B.X() ), Max( A.Y(), B.Y() ), Max( A.Z(), B.Z() ), Max( A.W(), B.W() ) ); } std::ostream &operator<<( std::ostream &out, const Vec4 &A ) { out << form( " %9.5f %9.5f %9.5f %9.5f", A.X(), A.Y(), A.Z(), A.W() ) << std::endl; return out; } };