PageRenderTime 20ms CodeModel.GetById 11ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/src/FreeImage/Source/OpenEXR/Imath/ImathLine.h

https://bitbucket.org/cabalistic/ogredeps/
C++ Header | 184 lines | 87 code | 40 blank | 57 comment | 2 complexity | 981e36982a1b5c7ddd7c30387c1859dd MD5 | raw file
  1///////////////////////////////////////////////////////////////////////////
  2//
  3// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
  4// Digital Ltd. LLC
  5// 
  6// All rights reserved.
  7// 
  8// Redistribution and use in source and binary forms, with or without
  9// modification, are permitted provided that the following conditions are
 10// met:
 11// *       Redistributions of source code must retain the above copyright
 12// notice, this list of conditions and the following disclaimer.
 13// *       Redistributions in binary form must reproduce the above
 14// copyright notice, this list of conditions and the following disclaimer
 15// in the documentation and/or other materials provided with the
 16// distribution.
 17// *       Neither the name of Industrial Light & Magic nor the names of
 18// its contributors may be used to endorse or promote products derived
 19// from this software without specific prior written permission. 
 20// 
 21// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 22// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 23// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 24// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 25// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 26// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 27// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 28// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 29// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 30// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 31// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 32//
 33///////////////////////////////////////////////////////////////////////////
 34
 35
 36
 37#ifndef INCLUDED_IMATHLINE_H
 38#define INCLUDED_IMATHLINE_H
 39
 40//-------------------------------------
 41//
 42//	A 3D line class template
 43//
 44//-------------------------------------
 45
 46#include "ImathVec.h"
 47#include "ImathLimits.h"
 48#include "ImathMatrix.h"
 49
 50namespace Imath {
 51
 52
 53template <class T>
 54class Line3
 55{
 56  public:
 57
 58    Vec3<T>			pos;
 59    Vec3<T>			dir;
 60    
 61    //-------------------------------------------------------------
 62    //	Constructors - default is normalized units along direction
 63    //-------------------------------------------------------------
 64
 65    Line3() {}
 66    Line3(const Vec3<T>& point1, const Vec3<T>& point2);
 67
 68    //------------------
 69    //	State Query/Set
 70    //------------------
 71
 72    void			set(const Vec3<T>& point1, 
 73				    const Vec3<T>& point2);
 74
 75    //-------
 76    //	F(t)
 77    //-------
 78
 79    Vec3<T>			operator() (T parameter) const;
 80
 81    //---------
 82    //	Query
 83    //---------
 84
 85    T				distanceTo(const Vec3<T>& point) const;
 86    T				distanceTo(const Line3<T>& line) const;
 87    Vec3<T>			closestPointTo(const Vec3<T>& point) const;
 88    Vec3<T>			closestPointTo(const Line3<T>& line) const;
 89};
 90
 91
 92//--------------------
 93// Convenient typedefs
 94//--------------------
 95
 96typedef Line3<float> Line3f;
 97typedef Line3<double> Line3d;
 98
 99
100//---------------
101// Implementation
102//---------------
103
104template <class T>
105inline Line3<T>::Line3(const Vec3<T> &p0, const Vec3<T> &p1)
106{
107    set(p0,p1);
108}
109
110template <class T>
111inline void Line3<T>::set(const Vec3<T> &p0, const Vec3<T> &p1)
112{
113    pos = p0; dir = p1-p0;
114    dir.normalize();
115}
116
117template <class T>
118inline Vec3<T> Line3<T>::operator()(T parameter) const
119{
120    return pos + dir * parameter;
121}
122
123template <class T>
124inline T Line3<T>::distanceTo(const Vec3<T>& point) const
125{
126    return (closestPointTo(point)-point).length();
127}
128
129template <class T>
130inline Vec3<T> Line3<T>::closestPointTo(const Vec3<T>& point) const
131{
132    return ((point - pos) ^ dir) * dir + pos;
133}
134
135template <class T>
136inline T Line3<T>::distanceTo(const Line3<T>& line) const
137{
138    T d = (dir % line.dir) ^ (line.pos - pos);
139    return (d >= 0)? d: -d;
140}
141
142template <class T>
143inline Vec3<T> 
144Line3<T>::closestPointTo(const Line3<T>& line) const
145{
146    // Assumes the lines are normalized
147
148    Vec3<T> posLpos = pos - line.pos ;
149    T c = dir ^ posLpos;
150    T a = line.dir ^ dir;
151    T f = line.dir ^ posLpos ;
152    T num = c - a * f;
153
154    T denom = a*a - 1;
155
156    T absDenom = ((denom >= 0)? denom: -denom);
157
158    if (absDenom < 1)
159    {
160	T absNum = ((num >= 0)? num: -num);
161
162	if (absNum >= absDenom * limits<T>::max())
163	    return pos;
164    }
165
166    return pos + dir * (num / denom);
167}
168
169template<class T>
170std::ostream& operator<< (std::ostream &o, const Line3<T> &line)
171{
172    return o << "(" << line.pos << ", " << line.dir << ")";
173}
174
175template<class S, class T>
176inline Line3<S> operator * (const Line3<S> &line, const Matrix44<T> &M)
177{
178    return Line3<S>( line.pos * M, (line.pos + line.dir) * M );
179}
180
181
182} // namespace Imath
183
184#endif