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-2009 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 Documentation © 2003-2009 by Nikolaus Gebhardt. Generated on Sun Jan 10 09:24:04 2010 by Doxygen (1.5.6)