rev |
line source |
nuclear@0
|
1 /*
|
nuclear@0
|
2 ---------------------------------------------------------------------------
|
nuclear@0
|
3 Open Asset Import Library (assimp)
|
nuclear@0
|
4 ---------------------------------------------------------------------------
|
nuclear@0
|
5
|
nuclear@0
|
6 Copyright (c) 2006-2018, assimp team
|
nuclear@0
|
7
|
nuclear@0
|
8
|
nuclear@0
|
9
|
nuclear@0
|
10 All rights reserved.
|
nuclear@0
|
11
|
nuclear@0
|
12 Redistribution and use of this software in source and binary forms,
|
nuclear@0
|
13 with or without modification, are permitted provided that the following
|
nuclear@0
|
14 conditions are met:
|
nuclear@0
|
15
|
nuclear@0
|
16 * Redistributions of source code must retain the above
|
nuclear@0
|
17 copyright notice, this list of conditions and the
|
nuclear@0
|
18 following disclaimer.
|
nuclear@0
|
19
|
nuclear@0
|
20 * Redistributions in binary form must reproduce the above
|
nuclear@0
|
21 copyright notice, this list of conditions and the
|
nuclear@0
|
22 following disclaimer in the documentation and/or other
|
nuclear@0
|
23 materials provided with the distribution.
|
nuclear@0
|
24
|
nuclear@0
|
25 * Neither the name of the assimp team, nor the names of its
|
nuclear@0
|
26 contributors may be used to endorse or promote products
|
nuclear@0
|
27 derived from this software without specific prior
|
nuclear@0
|
28 written permission of the assimp team.
|
nuclear@0
|
29
|
nuclear@0
|
30 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
nuclear@0
|
31 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
nuclear@0
|
32 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
nuclear@0
|
33 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
nuclear@0
|
34 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
nuclear@0
|
35 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
nuclear@0
|
36 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
nuclear@0
|
37 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
nuclear@0
|
38 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
nuclear@0
|
39 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
nuclear@0
|
40 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
nuclear@0
|
41 ---------------------------------------------------------------------------
|
nuclear@0
|
42 */
|
nuclear@0
|
43
|
nuclear@0
|
44 /** @file vector2.inl
|
nuclear@0
|
45 * @brief Inline implementation of aiVector2t<TReal> operators
|
nuclear@0
|
46 */
|
nuclear@0
|
47 #pragma once
|
nuclear@0
|
48 #ifndef AI_VECTOR2D_INL_INC
|
nuclear@0
|
49 #define AI_VECTOR2D_INL_INC
|
nuclear@0
|
50
|
nuclear@0
|
51 #ifdef __cplusplus
|
nuclear@0
|
52 #include "vector2.h"
|
nuclear@0
|
53
|
nuclear@0
|
54 #include <cmath>
|
nuclear@0
|
55
|
nuclear@0
|
56 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
57 template <typename TReal>
|
nuclear@0
|
58 template <typename TOther>
|
nuclear@0
|
59 aiVector2t<TReal>::operator aiVector2t<TOther> () const {
|
nuclear@0
|
60 return aiVector2t<TOther>(static_cast<TOther>(x),static_cast<TOther>(y));
|
nuclear@0
|
61 }
|
nuclear@0
|
62 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
63 template <typename TReal>
|
nuclear@0
|
64 inline
|
nuclear@0
|
65 void aiVector2t<TReal>::Set( TReal pX, TReal pY) {
|
nuclear@0
|
66 x = pX; y = pY;
|
nuclear@0
|
67 }
|
nuclear@0
|
68
|
nuclear@0
|
69 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
70 template <typename TReal>
|
nuclear@0
|
71 inline
|
nuclear@0
|
72 TReal aiVector2t<TReal>::SquareLength() const {
|
nuclear@0
|
73 return x*x + y*y;
|
nuclear@0
|
74 }
|
nuclear@0
|
75
|
nuclear@0
|
76 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
77 template <typename TReal>
|
nuclear@0
|
78 inline
|
nuclear@0
|
79 TReal aiVector2t<TReal>::Length() const {
|
nuclear@0
|
80 return std::sqrt( SquareLength());
|
nuclear@0
|
81 }
|
nuclear@0
|
82
|
nuclear@0
|
83 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
84 template <typename TReal>
|
nuclear@0
|
85 inline
|
nuclear@0
|
86 aiVector2t<TReal>& aiVector2t<TReal>::Normalize() {
|
nuclear@0
|
87 *this /= Length();
|
nuclear@0
|
88 return *this;
|
nuclear@0
|
89 }
|
nuclear@0
|
90
|
nuclear@0
|
91 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
92 template <typename TReal>
|
nuclear@0
|
93 inline
|
nuclear@0
|
94 const aiVector2t<TReal>& aiVector2t<TReal>::operator += (const aiVector2t& o) {
|
nuclear@0
|
95 x += o.x; y += o.y;
|
nuclear@0
|
96 return *this;
|
nuclear@0
|
97 }
|
nuclear@0
|
98
|
nuclear@0
|
99 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
100 template <typename TReal>
|
nuclear@0
|
101 inline
|
nuclear@0
|
102 const aiVector2t<TReal>& aiVector2t<TReal>::operator -= (const aiVector2t& o) {
|
nuclear@0
|
103 x -= o.x; y -= o.y;
|
nuclear@0
|
104 return *this;
|
nuclear@0
|
105 }
|
nuclear@0
|
106
|
nuclear@0
|
107 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
108 template <typename TReal>
|
nuclear@0
|
109 inline
|
nuclear@0
|
110 const aiVector2t<TReal>& aiVector2t<TReal>::operator *= (TReal f) {
|
nuclear@0
|
111 x *= f; y *= f;
|
nuclear@0
|
112 return *this;
|
nuclear@0
|
113 }
|
nuclear@0
|
114
|
nuclear@0
|
115 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
116 template <typename TReal>
|
nuclear@0
|
117 inline
|
nuclear@0
|
118 const aiVector2t<TReal>& aiVector2t<TReal>::operator /= (TReal f) {
|
nuclear@0
|
119 x /= f; y /= f;
|
nuclear@0
|
120 return *this;
|
nuclear@0
|
121 }
|
nuclear@0
|
122
|
nuclear@0
|
123 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
124 template <typename TReal>
|
nuclear@0
|
125 inline
|
nuclear@0
|
126 TReal aiVector2t<TReal>::operator[](unsigned int i) const {
|
nuclear@0
|
127 switch (i) {
|
nuclear@0
|
128 case 0:
|
nuclear@0
|
129 return x;
|
nuclear@0
|
130 case 1:
|
nuclear@0
|
131 return y;
|
nuclear@0
|
132 default:
|
nuclear@0
|
133 break;
|
nuclear@0
|
134
|
nuclear@0
|
135 }
|
nuclear@0
|
136 return x;
|
nuclear@0
|
137 }
|
nuclear@0
|
138
|
nuclear@0
|
139 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
140 template <typename TReal>
|
nuclear@0
|
141 inline
|
nuclear@0
|
142 bool aiVector2t<TReal>::operator== (const aiVector2t& other) const {
|
nuclear@0
|
143 return x == other.x && y == other.y;
|
nuclear@0
|
144 }
|
nuclear@0
|
145
|
nuclear@0
|
146 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
147 template <typename TReal>
|
nuclear@0
|
148 inline
|
nuclear@0
|
149 bool aiVector2t<TReal>::operator!= (const aiVector2t& other) const {
|
nuclear@0
|
150 return x != other.x || y != other.y;
|
nuclear@0
|
151 }
|
nuclear@0
|
152
|
nuclear@0
|
153 // ---------------------------------------------------------------------------
|
nuclear@0
|
154 template<typename TReal>
|
nuclear@0
|
155 inline
|
nuclear@0
|
156 bool aiVector2t<TReal>::Equal(const aiVector2t& other, TReal epsilon) const {
|
nuclear@0
|
157 return
|
nuclear@0
|
158 std::abs(x - other.x) <= epsilon &&
|
nuclear@0
|
159 std::abs(y - other.y) <= epsilon;
|
nuclear@0
|
160 }
|
nuclear@0
|
161
|
nuclear@0
|
162 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
163 template <typename TReal>
|
nuclear@0
|
164 inline
|
nuclear@0
|
165 aiVector2t<TReal>& aiVector2t<TReal>::operator= (TReal f) {
|
nuclear@0
|
166 x = y = f;
|
nuclear@0
|
167 return *this;
|
nuclear@0
|
168 }
|
nuclear@0
|
169
|
nuclear@0
|
170 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
171 template <typename TReal>
|
nuclear@0
|
172 inline
|
nuclear@0
|
173 const aiVector2t<TReal> aiVector2t<TReal>::SymMul(const aiVector2t& o) {
|
nuclear@0
|
174 return aiVector2t(x*o.x,y*o.y);
|
nuclear@0
|
175 }
|
nuclear@0
|
176
|
nuclear@0
|
177
|
nuclear@0
|
178 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
179 // symmetric addition
|
nuclear@0
|
180 template <typename TReal>
|
nuclear@0
|
181 inline
|
nuclear@0
|
182 aiVector2t<TReal> operator + (const aiVector2t<TReal>& v1, const aiVector2t<TReal>& v2) {
|
nuclear@0
|
183 return aiVector2t<TReal>( v1.x + v2.x, v1.y + v2.y);
|
nuclear@0
|
184 }
|
nuclear@0
|
185
|
nuclear@0
|
186 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
187 // symmetric subtraction
|
nuclear@0
|
188 template <typename TReal>
|
nuclear@0
|
189 inline
|
nuclear@0
|
190 aiVector2t<TReal> operator - (const aiVector2t<TReal>& v1, const aiVector2t<TReal>& v2) {
|
nuclear@0
|
191 return aiVector2t<TReal>( v1.x - v2.x, v1.y - v2.y);
|
nuclear@0
|
192 }
|
nuclear@0
|
193
|
nuclear@0
|
194 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
195 // scalar product
|
nuclear@0
|
196 template <typename TReal>
|
nuclear@0
|
197 inline
|
nuclear@0
|
198 TReal operator * (const aiVector2t<TReal>& v1, const aiVector2t<TReal>& v2) {
|
nuclear@0
|
199 return v1.x*v2.x + v1.y*v2.y;
|
nuclear@0
|
200 }
|
nuclear@0
|
201
|
nuclear@0
|
202 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
203 // scalar multiplication
|
nuclear@0
|
204 template <typename TReal>
|
nuclear@0
|
205 inline
|
nuclear@0
|
206 aiVector2t<TReal> operator * ( TReal f, const aiVector2t<TReal>& v) {
|
nuclear@0
|
207 return aiVector2t<TReal>( f*v.x, f*v.y);
|
nuclear@0
|
208 }
|
nuclear@0
|
209
|
nuclear@0
|
210 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
211 // and the other way around
|
nuclear@0
|
212 template <typename TReal>
|
nuclear@0
|
213 inline
|
nuclear@0
|
214 aiVector2t<TReal> operator * ( const aiVector2t<TReal>& v, TReal f) {
|
nuclear@0
|
215 return aiVector2t<TReal>( f*v.x, f*v.y);
|
nuclear@0
|
216 }
|
nuclear@0
|
217
|
nuclear@0
|
218 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
219 // scalar division
|
nuclear@0
|
220 template <typename TReal>
|
nuclear@0
|
221 inline
|
nuclear@0
|
222 aiVector2t<TReal> operator / ( const aiVector2t<TReal>& v, TReal f) {
|
nuclear@0
|
223 return v * (1/f);
|
nuclear@0
|
224 }
|
nuclear@0
|
225
|
nuclear@0
|
226 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
227 // vector division
|
nuclear@0
|
228 template <typename TReal>
|
nuclear@0
|
229 inline
|
nuclear@0
|
230 aiVector2t<TReal> operator / ( const aiVector2t<TReal>& v, const aiVector2t<TReal>& v2) {
|
nuclear@0
|
231 return aiVector2t<TReal>(v.x / v2.x,v.y / v2.y);
|
nuclear@0
|
232 }
|
nuclear@0
|
233
|
nuclear@0
|
234 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
235 // vector negation
|
nuclear@0
|
236 template <typename TReal>
|
nuclear@0
|
237 inline
|
nuclear@0
|
238 aiVector2t<TReal> operator - ( const aiVector2t<TReal>& v) {
|
nuclear@0
|
239 return aiVector2t<TReal>( -v.x, -v.y);
|
nuclear@0
|
240 }
|
nuclear@0
|
241
|
nuclear@0
|
242 #endif
|
nuclear@0
|
243
|
nuclear@0
|
244 #endif // AI_VECTOR2D_INL_INC
|