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>
248 template <
class T, Size DIM>
252 template <
typename T, Size DIM>
259 Vector_proxy_& operator=(
const Vector_proxy_& o);
300 template <
class T, Size DIM>
301 class Vector :
public Vector_struct<T, DIM>
338 inline const T*
end()
const {
return begin() + DIM; }
343 #if defined(DEBUG) || (defined(_MSC_VER) && _MSC_VER <= 1310)
351 T v = (Traits::has_signaling_NaN) ? Traits::signaling_NaN()
353 for(
Size i(0u); i < DIM; ++i)
361 for(
Size i(0u); i < DIM; ++i)
368 for(
Size i(0u); i < DIM; ++i)
385 template <
typename Iterator>
388 for(
Size i(0u); i < DIM; ++i, ++p)
403 template <
typename T2>
404 inline explicit Vector( T2
const (& array)[DIM])
406 for(
Size i(0u); i < DIM; ++i)
407 (*
this)[i] = array[i];
412 template <
typename T2>
415 for(
Size i(0u); i < DIM; ++i)
416 (*
this)[i] = T(other[i]);
421 template <
typename T2>
424 for(
Size i(0u); i < DIM; ++i)
583 for(
Size i(0u); i < DIM; ++i)
584 (*
this)[i] = other[i];
591 for(
Size i(0u); i < DIM; ++i)
630 inline const T&
get(
Size i)
const
655 const T rec_length = T(1) /
length( *
this);
656 const bool result =
isfinite( rec_length);
658 (*this) *= rec_length;
682 inline bool operator<( Vector_proxy_<T,DIM> rhs)
const
690 inline bool operator<=( Vector_proxy_<T,DIM> rhs)
const
716 template <
typename T, Size DIM>
721 for(
Size i(0u); i < DIM; ++i)
727 template <
typename T, Size DIM>
732 for(
Size i(0u); i < DIM; ++i)
738 template <
typename T, Size DIM>
743 for(
Size i(0u); i < DIM; ++i)
750 template <
typename T, Size DIM>
755 for(
Size i(0u); i < DIM; ++i)
761 template <
typename T,
typename U, Size DIM>
766 for(
Size i(0u); i < DIM; ++i)
767 lhs[i] = T(lhs[i] / rhs[i]);
772 template <
typename T, Size DIM>
782 template <
typename T, Size DIM>
792 template <
typename T, Size DIM>
803 template <
typename T, Size DIM>
813 template <
typename T,
typename U, Size DIM>
823 template <
typename T, Size DIM>
827 for(
Size i(0u); i < DIM; ++i)
837 template <
typename T,
typename TT, Size DIM>
842 for(
Size i(0u); i < DIM; ++i)
850 template <
typename T,
typename TT, Size DIM>
855 for(
Size i(0u); i < DIM; ++i)
861 template <
typename T,
typename TT, Size DIM>
866 for(
Size i(0u); i < DIM; ++i)
872 template <
typename T,
typename TT, Size DIM>
882 template <
typename T,
typename TT, Size DIM>
894 template <
typename T,
typename TT, Size DIM>
904 template <
typename T,
typename TT, Size DIM>
917 template <
typename T, Size DIM>
925 template <
typename T, Size DIM>
1048 template <
typename T, Size DIM>
1059 template <
typename T, Size DIM>
1070 template <
typename T, Size DIM>
1081 template <
typename T, Size DIM>
1092 template <
typename T, Size DIM>
1103 template <
typename T, Size DIM>
1117 template <
typename T, Size DIM>
1121 for(
Size i = 0; i != DIM; ++i)
1122 result[i] =
abs( v[i]);
1127 template <
typename T, Size DIM>
1131 for(
Size i = 0; i != DIM; ++i)
1132 result[i] =
acos( v[i]);
1137 template <
typename T, Size DIM>
1140 for(
Size i = 0; i != DIM; ++i)
1147 template <
typename T, Size DIM>
1150 for(
Size i = 0; i != DIM; ++i)
1157 template <
typename T, Size DIM>
1161 for(
Size i = 0; i != DIM; ++i)
1162 result[i] =
asin( v[i]);
1167 template <
typename T, Size DIM>
1171 for(
Size i = 0; i != DIM; ++i)
1172 result[i] =
atan( v[i]);
1179 template <
typename T, Size DIM>
1183 for(
Size i = 0; i != DIM; ++i)
1184 result[i] =
atan2( v[i], w[i]);
1190 template <
typename T, Size DIM>
1194 for(
Size i = 0; i != DIM; ++i)
1195 result[i] =
ceil( v[i]);
1200 template <
typename T, Size DIM>
1207 for(
Size i = 0u; i < DIM; ++i)
1208 result[i] =
clamp( v[i], low[i], high[i]);
1213 template <
typename T, Size DIM>
1220 for(
Size i = 0u; i < DIM; ++i)
1221 result[i] =
clamp( v[i], low[i], high);
1226 template <
typename T, Size DIM>
1233 for(
Size i = 0u; i < DIM; ++i)
1234 result[i] =
clamp( v[i], low, high[i]);
1239 template <
typename T, Size DIM>
1246 for(
Size i = 0u; i < DIM; ++i)
1247 result[i] =
clamp( v[i], low, high);
1252 template <
typename T, Size DIM>
1256 for(
Size i = 0; i != DIM; ++i)
1257 result[i] =
cos( v[i]);
1262 template <
typename T, Size DIM>
1266 for(
Size i = 0; i != DIM; ++i)
1272 template <
typename T, Size DIM>
1278 for(
Size i(0u); i < Vector<T,DIM>::DIMENSION; ++i)
1284 template <
typename T, Size DIM>
1290 for(
Size i(0u); i < Vector<T,DIM>::DIMENSION; ++i)
1296 template <
typename T, Size DIM>
1300 for(
Size i = 0; i != DIM; ++i)
1301 result[i] =
exp( v[i]);
1306 template <
typename T, Size DIM>
1310 for(
Size i = 0; i != DIM; ++i)
1311 result[i] =
exp2( v[i]);
1317 template <
typename T, Size DIM>
1321 for(
Size i = 0; i != DIM; ++i)
1322 result[i] =
floor( v[i]);
1329 template <
typename T, Size DIM>
1333 for(
Size i = 0; i != DIM; ++i)
1334 result[i] =
fmod( a[i], b[i]);
1341 template <
typename T, Size DIM>
1345 for(
Size i = 0; i != DIM; ++i)
1346 result[i] =
fmod( a[i], b);
1351 template <
typename T, Size DIM>
1355 for(
Size i = 0; i != DIM; ++i)
1356 result[i] =
frac( v[i]);
1361 template <
typename T, Size DIM>
1367 for(
Size i = 0u; i < DIM; ++i)
1375 template <
typename T, Size DIM>
1382 for(
Size i = 0; i != DIM; ++i)
1383 result[i] = v1[i] * (T(1)-t[i]) + v2[i] * t[i];
1389 template <
typename T, Size DIM>
1398 for(
Size i = 0; i != DIM; ++i)
1399 result[i] = v1[i] * t2 + v2[i] * t;
1404 template <
typename T, Size DIM>
1408 for(
Size i = 0; i != DIM; ++i)
1409 result[i] =
log( v[i]);
1414 template <
typename T, Size DIM>
1418 for(
Size i = 0; i != DIM; ++i)
1424 template <
typename T, Size DIM>
1428 for(
Size i = 0; i != DIM; ++i)
1429 result[i] =
log10( v[i]);
1437 template <
typename T, Size DIM>
1441 for(
Size j = 0; j != DIM; ++j)
1442 result[j] =
modf( v[j], i[j]);
1447 template <
typename T, Size DIM>
1451 for(
Size i = 0; i != DIM; ++i)
1452 result[i] =
pow( a[i], b[i]);
1457 template <
typename T, Size DIM>
1461 for(
Size i = 0; i != DIM; ++i)
1462 result[i] =
pow( a[i], b);
1467 template <
typename T, Size DIM>
1471 for(
Size i = 0; i != DIM; ++i)
1477 template <
typename T, Size DIM>
1481 for(
Size i = 0; i != DIM; ++i)
1482 result[i] =
round( v[i]);
1487 template <
typename T, Size DIM>
1491 for(
Size i = 0; i != DIM; ++i)
1492 result[i] =
rsqrt( v[i]);
1497 template <
typename T, Size DIM>
1501 for(
Size i = 0; i != DIM; ++i)
1507 template <
typename T, Size DIM>
1511 for(
Size i = 0; i != DIM; ++i)
1512 result[i] =
sign( v[i]);
1517 template <
typename T, Size DIM>
1521 for(
Size i = 0; i != DIM; ++i)
1522 result[i] =
sin( v[i]);
1529 template <
typename T, Size DIM>
1532 for(
Size i = 0; i != DIM; ++i)
1533 sincos( a[i], s[i], c[i]);
1541 template <
typename T, Size DIM>
1548 for(
Size i = 0; i != DIM; ++i)
1558 template <
typename T, Size DIM>
1565 for(
Size i = 0; i != DIM; ++i)
1571 template <
typename T, Size DIM>
1575 for(
Size i = 0; i != DIM; ++i)
1576 result[i] =
sqrt( v[i]);
1581 template <
typename T, Size DIM>
1585 for(
Size i = 0; i != DIM; ++i)
1586 result[i] =
step( a[i], v[i]);
1591 template <
typename T, Size DIM>
1595 for(
Size i = 0; i != DIM; ++i)
1596 result[i] =
tan( v[i]);
1604 template <
typename T>
1609 return lhs.x * rhs.y - lhs.y * rhs.x;
1613 template <
typename T>
1618 return Vector<T,3>( lhs.y * rhs.z - lhs.z * rhs.y,
1619 lhs.z * rhs.x - lhs.x * rhs.z,
1620 lhs.x * rhs.y - lhs.y * rhs.x);
1628 template <
typename T>
1634 #ifdef mi_base_assert_enabled
1635 const T eps = 1e-6f;
1644 if(
abs(n.x) <
abs(n.y)) {
1676 template <
typename T>
1684 const T eps = 1e-6f;
1706 if(
dot( *b,v) < T(0))
1726 template <
typename T2, Size DIM2,
typename T1, Size DIM1>
1729 const T2& fill = T2(0))
1733 for(
Size i = 0; i < dim_min; ++i)
1734 result[i] = T2(v[i]);
1735 for(
Size i = dim_min; i < DIM2; ++i)
1746 #endif // MI_MATH_VECTOR_H