10 #ifndef MI_MATH_VECTOR_H
11 #define MI_MATH_VECTOR_H
133 template <
typename T, Size DIM>
173 template <
typename T, Size DIM>
180 template <
typename T, Size DIM>
187 template <
typename T>
194 template <
typename T>
201 template <
typename T>
208 template <
typename T>
215 template <
typename T>
222 template <
typename T>
229 template <
typename T>
236 template <
typename T>
284 template <
class T, Size DIM>
322 inline const T*
end()
const {
return begin() + DIM; }
327 #if defined(DEBUG) || (defined(_MSC_VER) && _MSC_VER <= 1310)
335 T v = (Traits::has_signaling_NaN) ? Traits::signaling_NaN()
337 for(
Size i(0u); i < DIM; ++i)
342 #if (__cplusplus >= 201103L)
350 for(
Size i(0u); i < DIM; ++i)
357 for(
Size i(0u); i < DIM; ++i)
374 template <
typename Iterator>
377 for(
Size i(0u); i < DIM; ++i, ++p)
392 template <
typename T2>
393 inline explicit Vector( T2
const (& array)[DIM])
395 for(
Size i(0u); i < DIM; ++i)
396 (*
this)[i] = array[i];
401 template <
typename T2>
404 for(
Size i(0u); i < DIM; ++i)
405 (*
this)[i] = T(other[i]);
410 template <
typename T2>
413 for(
Size i(0u); i < DIM; ++i)
572 for(
Size i(0u); i < DIM; ++i)
573 (*
this)[i] = other[i];
580 for(
Size i(0u); i < DIM; ++i)
619 inline const T&
get(
Size i)
const
644 const T rec_length = T(1) /
length( *
this);
645 const bool result =
isfinite( rec_length);
647 (*this) *= rec_length;
669 inline bool operator<( Vector<T,DIM> rhs)
const
677 inline bool operator<=( Vector<T,DIM> rhs)
const
703 template <
typename T, Size DIM>
708 for(
Size i(0u); i < DIM; ++i)
714 template <
typename T, Size DIM>
719 for(
Size i(0u); i < DIM; ++i)
725 template <
typename T, Size DIM>
730 for(
Size i(0u); i < DIM; ++i)
737 template <
typename T, Size DIM>
742 for(
Size i(0u); i < DIM; ++i)
748 template <
typename T,
typename U, Size DIM>
753 for(
Size i(0u); i < DIM; ++i)
754 lhs[i] = T(lhs[i] / rhs[i]);
759 template <
typename T, Size DIM>
769 template <
typename T, Size DIM>
779 template <
typename T, Size DIM>
790 template <
typename T, Size DIM>
800 template <
typename T,
typename U, Size DIM>
810 template <
typename T, Size DIM>
814 for(
Size i(0u); i < DIM; ++i)
824 template <
typename T,
typename TT, Size DIM>
829 for(
Size i(0u); i < DIM; ++i)
837 template <
typename T,
typename TT, Size DIM>
842 for(
Size i(0u); i < DIM; ++i)
848 template <
typename T,
typename TT, Size DIM>
853 for(
Size i(0u); i < DIM; ++i)
859 template <
typename T,
typename TT, Size DIM>
869 template <
typename T,
typename TT, Size DIM>
881 template <
typename T,
typename TT, Size DIM>
891 template <
typename T,
typename TT, Size DIM>
904 template <
typename T, Size DIM>
912 template <
typename T, Size DIM>
1035 template <
typename T, Size DIM>
1046 template <
typename T, Size DIM>
1057 template <
typename T, Size DIM>
1068 template <
typename T, Size DIM>
1079 template <
typename T, Size DIM>
1090 template <
typename T, Size DIM>
1104 template <
typename T, Size DIM>
1108 for(
Size i = 0; i != DIM; ++i)
1109 result[i] =
abs( v[i]);
1114 template <
typename T, Size DIM>
1118 for(
Size i = 0; i != DIM; ++i)
1119 result[i] =
acos( v[i]);
1124 template <
typename T, Size DIM>
1127 for(
Size i = 0; i != DIM; ++i)
1134 template <
typename T, Size DIM>
1137 for(
Size i = 0; i != DIM; ++i)
1144 template <
typename T, Size DIM>
1148 for(
Size i = 0; i != DIM; ++i)
1149 result[i] =
asin( v[i]);
1154 template <
typename T, Size DIM>
1158 for(
Size i = 0; i != DIM; ++i)
1159 result[i] =
atan( v[i]);
1166 template <
typename T, Size DIM>
1170 for(
Size i = 0; i != DIM; ++i)
1171 result[i] =
atan2( v[i], w[i]);
1177 template <
typename T, Size DIM>
1181 for(
Size i = 0; i != DIM; ++i)
1182 result[i] =
ceil( v[i]);
1187 template <
typename T, Size DIM>
1194 for(
Size i = 0u; i < DIM; ++i)
1195 result[i] =
clamp( v[i], low[i], high[i]);
1200 template <
typename T, Size DIM>
1207 for(
Size i = 0u; i < DIM; ++i)
1208 result[i] =
clamp( v[i], low[i], high);
1213 template <
typename T, Size DIM>
1220 for(
Size i = 0u; i < DIM; ++i)
1221 result[i] =
clamp( v[i], low, high[i]);
1226 template <
typename T, Size DIM>
1233 for(
Size i = 0u; i < DIM; ++i)
1234 result[i] =
clamp( v[i], low, high);
1239 template <
typename T, Size DIM>
1243 for(
Size i = 0; i != DIM; ++i)
1244 result[i] =
cos( v[i]);
1249 template <
typename T, Size DIM>
1253 for(
Size i = 0; i != DIM; ++i)
1259 template <
typename T, Size DIM>
1265 for(
Size i(0u); i < Vector<T,DIM>::DIMENSION; ++i)
1271 template <
typename T, Size DIM>
1277 for(
Size i(0u); i < Vector<T,DIM>::DIMENSION; ++i)
1283 template <
typename T, Size DIM>
1287 for(
Size i = 0; i != DIM; ++i)
1288 result[i] =
exp( v[i]);
1293 template <
typename T, Size DIM>
1297 for(
Size i = 0; i != DIM; ++i)
1298 result[i] =
exp2( v[i]);
1304 template <
typename T, Size DIM>
1308 for(
Size i = 0; i != DIM; ++i)
1309 result[i] =
floor( v[i]);
1316 template <
typename T, Size DIM>
1320 for(
Size i = 0; i != DIM; ++i)
1321 result[i] =
fmod( a[i], b[i]);
1328 template <
typename T, Size DIM>
1332 for(
Size i = 0; i != DIM; ++i)
1333 result[i] =
fmod( a[i], b);
1338 template <
typename T, Size DIM>
1342 for(
Size i = 0; i != DIM; ++i)
1343 result[i] =
frac( v[i]);
1348 template <
typename T, Size DIM>
1354 for(
Size i = 0u; i < DIM; ++i)
1362 template <
typename T, Size DIM>
1369 for(
Size i = 0; i != DIM; ++i)
1370 result[i] = v1[i] * (T(1)-t[i]) + v2[i] * t[i];
1376 template <
typename T, Size DIM>
1385 for(
Size i = 0; i != DIM; ++i)
1386 result[i] = v1[i] * t2 + v2[i] * t;
1391 template <
typename T, Size DIM>
1395 for(
Size i = 0; i != DIM; ++i)
1396 result[i] =
log( v[i]);
1401 template <
typename T, Size DIM>
1405 for(
Size i = 0; i != DIM; ++i)
1411 template <
typename T, Size DIM>
1415 for(
Size i = 0; i != DIM; ++i)
1416 result[i] =
log10( v[i]);
1424 template <
typename T, Size DIM>
1428 for(
Size j = 0; j != DIM; ++j)
1429 result[j] =
modf( v[j], i[j]);
1434 template <
typename T, Size DIM>
1438 for(
Size i = 0; i != DIM; ++i)
1439 result[i] =
pow( a[i], b[i]);
1444 template <
typename T, Size DIM>
1448 for(
Size i = 0; i != DIM; ++i)
1449 result[i] =
pow( a[i], b);
1454 template <
typename T, Size DIM>
1458 for(
Size i = 0; i != DIM; ++i)
1464 template <
typename T, Size DIM>
1468 for(
Size i = 0; i != DIM; ++i)
1469 result[i] =
round( v[i]);
1474 template <
typename T, Size DIM>
1478 for(
Size i = 0; i != DIM; ++i)
1479 result[i] =
rsqrt( v[i]);
1484 template <
typename T, Size DIM>
1488 for(
Size i = 0; i != DIM; ++i)
1494 template <
typename T, Size DIM>
1498 for(
Size i = 0; i != DIM; ++i)
1499 result[i] =
sign( v[i]);
1504 template <
typename T, Size DIM>
1508 for(
Size i = 0; i != DIM; ++i)
1509 result[i] =
sin( v[i]);
1516 template <
typename T, Size DIM>
1519 for(
Size i = 0; i != DIM; ++i)
1520 sincos( a[i], s[i], c[i]);
1528 template <
typename T, Size DIM>
1535 for(
Size i = 0; i != DIM; ++i)
1545 template <
typename T, Size DIM>
1552 for(
Size i = 0; i != DIM; ++i)
1558 template <
typename T, Size DIM>
1562 for(
Size i = 0; i != DIM; ++i)
1563 result[i] =
sqrt( v[i]);
1568 template <
typename T, Size DIM>
1572 for(
Size i = 0; i != DIM; ++i)
1573 result[i] =
step( a[i], v[i]);
1578 template <
typename T, Size DIM>
1582 for(
Size i = 0; i != DIM; ++i)
1583 result[i] =
tan( v[i]);
1591 template <
typename T>
1596 return lhs.x * rhs.y - lhs.y * rhs.x;
1600 template <
typename T>
1605 return Vector<T,3>( lhs.y * rhs.z - lhs.z * rhs.y,
1606 lhs.z * rhs.x - lhs.x * rhs.z,
1607 lhs.x * rhs.y - lhs.y * rhs.x);
1615 template <
typename T>
1621 #ifdef mi_base_assert_enabled
1622 const T eps = 1e-6f;
1631 if(
abs(n.x) <
abs(n.y)) {
1663 template <
typename T>
1671 const T eps = 1e-6f;
1693 if(
dot( *b,v) < T(0))
1713 template <
typename T2, Size DIM2,
typename T1, Size DIM1>
1716 const T2& fill = T2(0))
1720 for(
Size i = 0; i < dim_min; ++i)
1721 result[i] = T2(v[i]);
1722 for(
Size i = dim_min; i < DIM2; ++i)
1733 #endif // MI_MATH_VECTOR_H