1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////////////////////////////////////////////////////// 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Digital Ltd. LLC 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// All rights reserved. 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Redistribution and use in source and binary forms, with or without 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// modification, are permitted provided that the following conditions are 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// met: 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * Redistributions of source code must retain the above copyright 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// notice, this list of conditions and the following disclaimer. 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * Redistributions in binary form must reproduce the above 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// copyright notice, this list of conditions and the following disclaimer 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// in the documentation and/or other materials provided with the 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// distribution. 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// * Neither the name of Industrial Light & Magic nor the names of 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// its contributors may be used to endorse or promote products derived 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// from this software without specific prior written permission. 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////////////////////////////////////////////////////// 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifndef INCLUDED_IMATHLINE_H 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define INCLUDED_IMATHLINE_H 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------- 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// A 3D line class template 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//------------------------------------- 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "ImathVec.h" 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "ImathLimits.h" 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "ImathMatrix.h" 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace Imath { 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerclass Line3 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler public: 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec3<T> pos; 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec3<T> dir; 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //------------------------------------------------------------- 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Constructors - default is normalized units along direction 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //------------------------------------------------------------- 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Line3() {} 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Line3(const Vec3<T>& point1, const Vec3<T>& point2); 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //------------------ 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // State Query/Set 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //------------------ 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler void set(const Vec3<T>& point1, 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const Vec3<T>& point2); 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //------- 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // F(t) 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //------- 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec3<T> operator() (T parameter) const; 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //--------- 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Query 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler //--------- 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T distanceTo(const Vec3<T>& point) const; 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T distanceTo(const Line3<T>& line) const; 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec3<T> closestPointTo(const Vec3<T>& point) const; 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec3<T> closestPointTo(const Line3<T>& line) const; 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//-------------------- 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Convenient typedefs 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//-------------------- 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef Line3<float> Line3f; 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef Line3<double> Line3d; 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//--------------- 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Implementation 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//--------------- 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline Line3<T>::Line3(const Vec3<T> &p0, const Vec3<T> &p1) 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler set(p0,p1); 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline void Line3<T>::set(const Vec3<T> &p0, const Vec3<T> &p1) 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler pos = p0; dir = p1-p0; 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler dir.normalize(); 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline Vec3<T> Line3<T>::operator()(T parameter) const 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return pos + dir * parameter; 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline T Line3<T>::distanceTo(const Vec3<T>& point) const 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (closestPointTo(point)-point).length(); 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline Vec3<T> Line3<T>::closestPointTo(const Vec3<T>& point) const 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return ((point - pos) ^ dir) * dir + pos; 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline T Line3<T>::distanceTo(const Line3<T>& line) const 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T d = (dir % line.dir) ^ (line.pos - pos); 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (d >= 0)? d: -d; 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate <class T> 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline Vec3<T> 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLine3<T>::closestPointTo(const Line3<T>& line) const 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler // Assumes the lines are normalized 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec3<T> posLpos = pos - line.pos ; 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T c = dir ^ posLpos; 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T a = line.dir ^ dir; 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T f = line.dir ^ posLpos ; 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T num = c - a * f; 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T denom = a*a - 1; 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T absDenom = ((denom >= 0)? denom: -denom); 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (absDenom < 1) 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler T absNum = ((num >= 0)? num: -num); 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (absNum >= absDenom * limits<T>::max()) 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return pos; 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return pos + dir * (num / denom); 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<class T> 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstd::ostream& operator<< (std::ostream &o, const Line3<T> &line) 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return o << "(" << line.pos << ", " << line.dir << ")"; 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertemplate<class S, class T> 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinline Line3<S> operator * (const Line3<S> &line, const Matrix44<T> &M) 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return Line3<S>( line.pos * M, (line.pos + line.dir) * M ); 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} // namespace Imath 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 185