PBRT
/home/felix/UBC/projects/AdaptiveLightfieldSampling/pbrt_v2/src/3rdparty/ilmbase-1.0.2/ImathVecAlgo.h
00001 
00002 //
00003 // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
00004 // Digital Ltd. LLC
00005 // 
00006 // All rights reserved.
00007 // 
00008 // Redistribution and use in source and binary forms, with or without
00009 // modification, are permitted provided that the following conditions are
00010 // met:
00011 // *       Redistributions of source code must retain the above copyright
00012 // notice, this list of conditions and the following disclaimer.
00013 // *       Redistributions in binary form must reproduce the above
00014 // copyright notice, this list of conditions and the following disclaimer
00015 // in the documentation and/or other materials provided with the
00016 // distribution.
00017 // *       Neither the name of Industrial Light & Magic nor the names of
00018 // its contributors may be used to endorse or promote products derived
00019 // from this software without specific prior written permission. 
00020 // 
00021 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00022 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00023 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00024 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00025 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00026 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00027 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00028 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00029 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00030 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00031 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00032 //
00034 
00035 
00036 
00037 #ifndef INCLUDED_IMATHVECALGO_H
00038 #define INCLUDED_IMATHVECALGO_H
00039 
00040 //-------------------------------------------------------------------------
00041 //
00042 //      This file contains algorithms applied to or in conjunction
00043 //      with points (Imath::Vec2 and Imath::Vec3).
00044 //      The assumption made is that these functions are called much
00045 //      less often than the basic point functions or these functions
00046 //      require more support classes.
00047 //
00048 //-------------------------------------------------------------------------
00049 
00050 #include "ImathVec.h"
00051 #include "ImathLimits.h"
00052 
00053 namespace Imath {
00054 
00055 
00056 //-----------------------------------------------------------------
00057 // Find the projection of vector t onto vector s (Vec2, Vec3, Vec4)
00058 //-----------------------------------------------------------------
00059 
00060 template <class Vec> Vec        project (const Vec &s, const Vec &t);
00061 
00062 
00063 //------------------------------------------------
00064 // Find a vector that is perpendicular to s and
00065 // in the same plane as s and t (Vec2, Vec3, Vec4)
00066 //------------------------------------------------
00067 
00068 template <class Vec> Vec        orthogonal (const Vec &s, const Vec &t);
00069 
00070 
00071 //-----------------------------------------------
00072 // Find the direction of a ray s after reflection
00073 // off a plane with normal t (Vec2, Vec3, Vec4)
00074 //-----------------------------------------------
00075 
00076 template <class Vec> Vec        reflect (const Vec &s, const Vec &t);
00077 
00078 
00079 //--------------------------------------------------------------------
00080 // Find the vertex of triangle (v0, v1, v2) that is closest to point p
00081 // (Vec2, Vec3, Vec4)
00082 //--------------------------------------------------------------------
00083 
00084 template <class Vec> Vec        closestVertex (const Vec &v0,
00085                                                const Vec &v1,
00086                                                const Vec &v2, 
00087                                                const Vec &p);
00088 
00089 //---------------
00090 // Implementation
00091 //---------------
00092 
00093 template <class Vec>
00094 Vec
00095 project (const Vec &s, const Vec &t)
00096 {
00097     Vec sNormalized = s.normalized();
00098     return sNormalized * (sNormalized ^ t);
00099 }
00100 
00101 template <class Vec>
00102 Vec
00103 orthogonal (const Vec &s, const Vec &t)
00104 {
00105     return t - project (s, t);
00106 }
00107 
00108 template <class Vec>
00109 Vec
00110 reflect (const Vec &s, const Vec &t)
00111 {
00112     return s - typename Vec::BaseType(2) * (s - project(t, s));
00113 }
00114 
00115 template <class Vec>
00116 Vec
00117 closestVertex(const Vec &v0,
00118               const Vec &v1,
00119               const Vec &v2, 
00120               const Vec &p)
00121 {
00122     Vec nearest = v0;
00123     typename Vec::BaseType neardot = (v0 - p).length2();
00124     typename Vec::BaseType tmp     = (v1 - p).length2();
00125 
00126     if (tmp < neardot)
00127     {
00128         neardot = tmp;
00129         nearest = v1;
00130     }
00131 
00132     tmp = (v2 - p).length2();
00133 
00134     if (tmp < neardot)
00135     {
00136         neardot = tmp;
00137         nearest = v2;
00138     }
00139 
00140     return nearest;
00141 }
00142 
00143 
00144 } // namespace Imath
00145 
00146 #endif