26 #ifndef UTIL_MATH_VECTOR2_INL_H__ 27 #define UTIL_MATH_VECTOR2_INL_H__ 29 #include "util/math/vector2.h" 32 #include "base/integral_types.h" 34 #include "base/type_traits.h" 35 #include "util/math/mathutil.h" 36 #include "util/math/vector3.h" 37 #include "util/math/vector4.h" 39 template <
typename VType>
43 template <
typename VType>
48 template <
typename VType>
53 template <
typename VType>
58 template <
typename VType>
64 template <
typename VType>
template <
typename VType2>
66 return Self(static_cast<VType>(vb[0]),
67 static_cast<VType>(vb[1]));
70 template <
typename VType>
76 template <
typename VType>
83 template <
typename VType>
90 template <
typename VType>
97 template <
typename VType>
104 template <
typename VType>
111 template <
typename VType>
113 return Self(c_[0] * vb.c_[0], c_[1] * vb.c_[1]);
116 template <
typename VType>
118 return Self(c_[0] / vb.c_[0], c_[1] / vb.c_[1]);
121 template <
typename VType>
123 return Self(*
this) += vb;
126 template <
typename VType>
128 return Self(*
this) -= vb;
131 template <
typename VType>
133 return Self(-c_[0], -c_[1]);
136 template <
typename VType>
138 return c_[0] * vb.c_[0] + c_[1] * vb.c_[1];
141 template <
typename VType>
143 return Self(*
this) *= k;
146 template <
typename VType>
148 return Self(*
this) /= k;
151 template <
typename VType>
153 return c_[0] * vb.c_[1] - c_[1] * vb.c_[0];
156 template <
typename VType>
163 template <
typename VType>
170 template <
typename VType>
175 template <
typename VType>
180 template <
typename VType>
185 template <
typename VType>
192 template <
typename VType>
194 return reinterpret_cast<VType*>(c_);
197 template <
typename VType>
199 return reinterpret_cast<const VType*>(c_);
203 template <
typename VType>
205 return c_[0]*c_[0] + c_[1]*c_[1];
209 template <
typename VType>
211 return sqrt(Norm2());
214 template <
typename VType>
216 return atan2(this->CrossProd(v), this->DotProd(v));
219 template <
typename VType>
221 COMPILE_ASSERT(!std::is_integral<VType>::value, must_be_floating_point);
226 return Self(*
this) *= n;
229 template <
typename VType>
231 return (c_[0] == vb.c_[0]) && (c_[1] == vb.c_[1]);
234 template <
typename VType>
236 return (c_[0] != vb.c_[0]) || (c_[1] != vb.c_[1]);
239 template <
typename VType>
241 return (fabs(c_[0]-vb.c_[0]) < margin) && (fabs(c_[1]-vb.c_[1]) < margin);
244 template <
typename VType>
246 if ( c_[0] < vb.c_[0] )
return true;
247 if ( vb.c_[0] < c_[0] )
return false;
248 if ( c_[1] < vb.c_[1] )
return true;
252 template <
typename VType>
254 return vb.operator<(*this);
257 template <
typename VType>
259 return !operator>(vb);
262 template <
typename VType>
264 return !operator<(vb);
267 template <
typename VType>
269 return Self(-c_[1], c_[0]);
272 template <
typename VType>
274 return Self(sqrt(c_[0]), sqrt(c_[1]));
277 template <
typename VType>
279 return Self(fabs(c_[0]), fabs(c_[1]));
282 template <
typename VType>
284 COMPILE_ASSERT(std::is_integral<VType>::value, use_Fabs_for_float_types);
285 COMPILE_ASSERT(static_cast<VType>(-1) == -1, type_must_be_signed);
286 COMPILE_ASSERT(
sizeof(VType) <=
sizeof(
int), Abs_truncates_to_int);
287 return Self(abs(c_[0]), abs(c_[1]));
290 template <
typename VType>
292 return Self(floor(c_[0]), floor(c_[1]));
296 template <
typename VType>
298 return Self(ceil(c_[0]), ceil(c_[1]));
302 template <
typename VType>
304 return Self(rint(c_[0]), rint(c_[1]));
307 template <
typename VType>
312 template <
typename VType>
314 c_[1] = c_[0] = VType();
317 template <
typename VType>
319 return isnan(c_[0]) || isnan(c_[1]);
322 template <
typename VType>
324 return Self(MathUtil::NaN(), MathUtil::NaN());
327 template <
typename ScalarType,
typename VType2>
332 template <
typename ScalarType,
typename VType2>
337 template <
typename VType>
342 template <
typename VType>
347 template <
typename VType>
348 std::ostream &operator <<(std::ostream &out,
const Vector2<VType> &va) {
358 PROPAGATE_POD_FROM_TEMPLATE_ARGUMENT(
Vector2);
360 #endif // UTIL_MATH_VECTOR2_INL_H__