Home | Namespaces | Hierarchy | Alphabetical List | Class list | Files | Namespace Members | Class members | File members | Tutorials

line3d.h

Go to the documentation of this file.
00001 // Copyright (C) 2002-2010 Nikolaus Gebhardt
00002 // This file is part of the "Irrlicht Engine".
00003 // For conditions of distribution and use, see copyright notice in irrlicht.h
00004 
00005 #ifndef __IRR_LINE_3D_H_INCLUDED__
00006 #define __IRR_LINE_3D_H_INCLUDED__
00007 
00008 #include "irrTypes.h"
00009 #include "vector3d.h"
00010 
00011 namespace irr
00012 {
00013 namespace core
00014 {
00015 
00017 template <class T>
00018 class line3d
00019 {
00020         public:
00021 
00023 
00024                 line3d() : start(0,0,0), end(1,1,1) {}
00026                 line3d(T xa, T ya, T za, T xb, T yb, T zb) : start(xa, ya, za), end(xb, yb, zb) {}
00028                 line3d(const vector3d<T>& start, const vector3d<T>& end) : start(start), end(end) {}
00029 
00030                 // operators
00031 
00032                 line3d<T> operator+(const vector3d<T>& point) const { return line3d<T>(start + point, end + point); }
00033                 line3d<T>& operator+=(const vector3d<T>& point) { start += point; end += point; return *this; }
00034 
00035                 line3d<T> operator-(const vector3d<T>& point) const { return line3d<T>(start - point, end - point); }
00036                 line3d<T>& operator-=(const vector3d<T>& point) { start -= point; end -= point; return *this; }
00037 
00038                 bool operator==(const line3d<T>& other) const
00039                 { return (start==other.start && end==other.end) || (end==other.start && start==other.end);}
00040                 bool operator!=(const line3d<T>& other) const
00041                 { return !(start==other.start && end==other.end) || (end==other.start && start==other.end);}
00042 
00043                 // functions
00045                 void setLine(const T& xa, const T& ya, const T& za, const T& xb, const T& yb, const T& zb)
00046                 {start.set(xa, ya, za); end.set(xb, yb, zb);}
00048                 void setLine(const vector3d<T>& nstart, const vector3d<T>& nend)
00049                 {start.set(nstart); end.set(nend);}
00051                 void setLine(const line3d<T>& line)
00052                 {start.set(line.start); end.set(line.end);}
00053 
00055 
00056                 T getLength() const { return start.getDistanceFrom(end); }
00057 
00059 
00060                 T getLengthSQ() const { return start.getDistanceFromSQ(end); }
00061 
00063 
00064                 vector3d<T> getMiddle() const
00065                 {
00066                         return (start + end) * (T)0.5;
00067                 }
00068 
00070 
00071                 vector3d<T> getVector() const
00072                 {
00073                         return end - start;
00074                 }
00075 
00077 
00081                 bool isPointBetweenStartAndEnd(const vector3d<T>& point) const
00082                 {
00083                         return point.isBetweenPoints(start, end);
00084                 }
00085 
00087 
00089                 vector3d<T> getClosestPoint(const vector3d<T>& point) const
00090                 {
00091                         vector3d<T> c = point - start;
00092                         vector3d<T> v = end - start;
00093                         T d = (T)v.getLength();
00094                         v /= d;
00095                         T t = v.dotProduct(c);
00096 
00097                         if (t < (T)0.0)
00098                                 return start;
00099                         if (t > d)
00100                                 return end;
00101 
00102                         v *= t;
00103                         return start + v;
00104                 }
00105 
00107 
00113                 bool getIntersectionWithSphere(vector3d<T> sorigin, T sradius, f64& outdistance) const
00114                 {
00115                         const vector3d<T> q = sorigin - start;
00116                         T c = q.getLength();
00117                         T v = q.dotProduct(getVector().normalize());
00118                         T d = sradius * sradius - (c*c - v*v);
00119 
00120                         if (d < 0.0)
00121                                 return false;
00122 
00123                         outdistance = v - core::squareroot ( d );
00124                         return true;
00125                 }
00126 
00127                 // member variables
00128 
00130                 vector3d<T> start;
00132                 vector3d<T> end;
00133 };
00134 
00136         typedef line3d<f32> line3df;
00138         typedef line3d<s32> line3di;
00139 
00140 } // end namespace core
00141 } // end namespace irr
00142 
00143 #endif
00144 

The Irrlicht Engine
The Irrlicht Engine Documentation © 2003-2010 by Nikolaus Gebhardt. Generated on Sun Oct 24 12:41:57 2010 by Doxygen (1.6.2)