diff options
Diffstat (limited to 'libraries/irrlicht-1.8.1/include/line3d.h')
-rw-r--r-- | libraries/irrlicht-1.8.1/include/line3d.h | 144 |
1 files changed, 0 insertions, 144 deletions
diff --git a/libraries/irrlicht-1.8.1/include/line3d.h b/libraries/irrlicht-1.8.1/include/line3d.h deleted file mode 100644 index 6ec4e70..0000000 --- a/libraries/irrlicht-1.8.1/include/line3d.h +++ /dev/null | |||
@@ -1,144 +0,0 @@ | |||
1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt | ||
2 | // This file is part of the "Irrlicht Engine". | ||
3 | // For conditions of distribution and use, see copyright notice in irrlicht.h | ||
4 | |||
5 | #ifndef __IRR_LINE_3D_H_INCLUDED__ | ||
6 | #define __IRR_LINE_3D_H_INCLUDED__ | ||
7 | |||
8 | #include "irrTypes.h" | ||
9 | #include "vector3d.h" | ||
10 | |||
11 | namespace irr | ||
12 | { | ||
13 | namespace core | ||
14 | { | ||
15 | |||
16 | //! 3D line between two points with intersection methods. | ||
17 | template <class T> | ||
18 | class line3d | ||
19 | { | ||
20 | public: | ||
21 | |||
22 | //! Default constructor | ||
23 | /** line from (0,0,0) to (1,1,1) */ | ||
24 | line3d() : start(0,0,0), end(1,1,1) {} | ||
25 | //! Constructor with two points | ||
26 | line3d(T xa, T ya, T za, T xb, T yb, T zb) : start(xa, ya, za), end(xb, yb, zb) {} | ||
27 | //! Constructor with two points as vectors | ||
28 | line3d(const vector3d<T>& start, const vector3d<T>& end) : start(start), end(end) {} | ||
29 | |||
30 | // operators | ||
31 | |||
32 | line3d<T> operator+(const vector3d<T>& point) const { return line3d<T>(start + point, end + point); } | ||
33 | line3d<T>& operator+=(const vector3d<T>& point) { start += point; end += point; return *this; } | ||
34 | |||
35 | line3d<T> operator-(const vector3d<T>& point) const { return line3d<T>(start - point, end - point); } | ||
36 | line3d<T>& operator-=(const vector3d<T>& point) { start -= point; end -= point; return *this; } | ||
37 | |||
38 | bool operator==(const line3d<T>& other) const | ||
39 | { return (start==other.start && end==other.end) || (end==other.start && start==other.end);} | ||
40 | bool operator!=(const line3d<T>& other) const | ||
41 | { return !(start==other.start && end==other.end) || (end==other.start && start==other.end);} | ||
42 | |||
43 | // functions | ||
44 | //! Set this line to a new line going through the two points. | ||
45 | void setLine(const T& xa, const T& ya, const T& za, const T& xb, const T& yb, const T& zb) | ||
46 | {start.set(xa, ya, za); end.set(xb, yb, zb);} | ||
47 | //! Set this line to a new line going through the two points. | ||
48 | void setLine(const vector3d<T>& nstart, const vector3d<T>& nend) | ||
49 | {start.set(nstart); end.set(nend);} | ||
50 | //! Set this line to new line given as parameter. | ||
51 | void setLine(const line3d<T>& line) | ||
52 | {start.set(line.start); end.set(line.end);} | ||
53 | |||
54 | //! Get length of line | ||
55 | /** \return Length of line. */ | ||
56 | T getLength() const { return start.getDistanceFrom(end); } | ||
57 | |||
58 | //! Get squared length of line | ||
59 | /** \return Squared length of line. */ | ||
60 | T getLengthSQ() const { return start.getDistanceFromSQ(end); } | ||
61 | |||
62 | //! Get middle of line | ||
63 | /** \return Center of line. */ | ||
64 | vector3d<T> getMiddle() const | ||
65 | { | ||
66 | return (start + end)/(T)2; | ||
67 | } | ||
68 | |||
69 | //! Get vector of line | ||
70 | /** \return vector of line. */ | ||
71 | vector3d<T> getVector() const | ||
72 | { | ||
73 | return end - start; | ||
74 | } | ||
75 | |||
76 | //! Check if the given point is between start and end of the line. | ||
77 | /** Assumes that the point is already somewhere on the line. | ||
78 | \param point The point to test. | ||
79 | \return True if point is on the line between start and end, else false. | ||
80 | */ | ||
81 | bool isPointBetweenStartAndEnd(const vector3d<T>& point) const | ||
82 | { | ||
83 | return point.isBetweenPoints(start, end); | ||
84 | } | ||
85 | |||
86 | //! Get the closest point on this line to a point | ||
87 | /** \param point The point to compare to. | ||
88 | \return The nearest point which is part of the line. */ | ||
89 | vector3d<T> getClosestPoint(const vector3d<T>& point) const | ||
90 | { | ||
91 | vector3d<T> c = point - start; | ||
92 | vector3d<T> v = end - start; | ||
93 | T d = (T)v.getLength(); | ||
94 | v /= d; | ||
95 | T t = v.dotProduct(c); | ||
96 | |||
97 | if (t < (T)0.0) | ||
98 | return start; | ||
99 | if (t > d) | ||
100 | return end; | ||
101 | |||
102 | v *= t; | ||
103 | return start + v; | ||
104 | } | ||
105 | |||
106 | //! Check if the line intersects with a shpere | ||
107 | /** \param sorigin: Origin of the shpere. | ||
108 | \param sradius: Radius of the sphere. | ||
109 | \param outdistance: The distance to the first intersection point. | ||
110 | \return True if there is an intersection. | ||
111 | If there is one, the distance to the first intersection point | ||
112 | is stored in outdistance. */ | ||
113 | bool getIntersectionWithSphere(vector3d<T> sorigin, T sradius, f64& outdistance) const | ||
114 | { | ||
115 | const vector3d<T> q = sorigin - start; | ||
116 | T c = q.getLength(); | ||
117 | T v = q.dotProduct(getVector().normalize()); | ||
118 | T d = sradius * sradius - (c*c - v*v); | ||
119 | |||
120 | if (d < 0.0) | ||
121 | return false; | ||
122 | |||
123 | outdistance = v - core::squareroot ( d ); | ||
124 | return true; | ||
125 | } | ||
126 | |||
127 | // member variables | ||
128 | |||
129 | //! Start point of line | ||
130 | vector3d<T> start; | ||
131 | //! End point of line | ||
132 | vector3d<T> end; | ||
133 | }; | ||
134 | |||
135 | //! Typedef for an f32 line. | ||
136 | typedef line3d<f32> line3df; | ||
137 | //! Typedef for an integer line. | ||
138 | typedef line3d<s32> line3di; | ||
139 | |||
140 | } // end namespace core | ||
141 | } // end namespace irr | ||
142 | |||
143 | #endif | ||
144 | |||