36 template<
typename TYPE,
int _IQTY,
class _TYPE_C>
47 static const int k_nDim = _IQTY;
57 return (
const TYPE*)
this;
59 const _TYPE_C&
get_CR() const noexcept
61 return *((_TYPE_C*)
this);
64 operator const TYPE*()
const noexcept
76 inline TYPE operator[] (
int i)
const noexcept
87 for (
int i = 0; i < _IQTY; i++)
89 if (get_CT()[i] != (
TYPE)0)
97 return ::memcmp(get_CT(), v2.get_CT(),
sizeof(
TYPE)*_IQTY);
101 return Compare(v2) == 0 ;
105 return Compare(v2) != 0 ;
110 for (
int i = 0; i < _IQTY; i++)
123 for (
int i = 0; i < _IQTY; i++)
136 _TYPE_C operator -()
const
140 for (
int i = 0; i < _IQTY; i++)
142 vr.RefElem(i) = -GetElem(i);
149 for (
int i = 0; i < _IQTY; i++)
160 for (
int i = 0; i < _IQTY; i++)
162 vr.RefElem(i) = GetElem(i) + v2.
GetElem(i);
174 for (
int i = 0; i < _IQTY; i++)
176 vr.RefElem(i) = GetElem(i) - v2.
GetElem(i);
180 inline _TYPE_C operator - (
const THIS_t& v2)
const
188 for (
int i = 0; i < _IQTY; i++)
190 vr.RefElem(i) = GetElem(i) * nScale;
197 return GetScaled(nScale);
199 _TYPE_C operator / (
TYPE nScale)
const
202 return GetScaled(((
TYPE)1) / nScale);
212 for (
int i = 0; i < _IQTY; i++)
214 vr.RefElem(i) = GetElem(i) * v2.
GetElem(i);
224 for (
int i = 0; i < _IQTY; i++)
226 vr.RefElem(i) = GetElem(i) / v2.
GetElem(i);
231 inline _TYPE_C
operator * (
const THIS_t& v2)
const
236 inline _TYPE_C operator / (
const THIS_t& v2)
const
246 _TYPE_C vd = GetDiff(v2);
247 return vd.get_MagnitudeSq();
265 for (
int i = 0; i < _IQTY; i++)
267 nMagnitude += GetElem(i) * v2.
GetElem(i);
287 TYPE nLength = get_Magnitude();
290 for (
int i = 0; i < _IQTY; i++)
292 vr.RefElem(i) = GetElem(i) / nLength;
314 return ((
TYPE*)
this)[i];
316 inline TYPE& operator[] (
int i)
324 ::memcpy(
this, &v,
sizeof(
TYPE) * _IQTY);
338 TYPE nLength = get_Magnitude();
341 DoScale(((
TYPE)1) / nLength);
353 TYPE nLengthOld = get_Magnitude();
356 DoScale(nLength / nLengthOld);
364 for (
int i = 0; i < _IQTY; i++)
372 const _TYPE_C& operator += (
const THIS_t& v2)
374 for (
int i = 0; i < _IQTY; i++)
378 return *((_TYPE_C*)
this);
380 const _TYPE_C& operator += (
TYPE n)
382 for (
int i = 0; i < _IQTY; i++)
386 return *((_TYPE_C*)
this);
388 const _TYPE_C& operator -= (
const THIS_t& v2) noexcept
390 for (
int i = 0; i < _IQTY; i++)
394 return *((_TYPE_C*)
this);
396 const _TYPE_C& operator -= (
TYPE n) noexcept
398 for (
int i = 0; i < _IQTY; i++)
402 return *((_TYPE_C*)
this);
407 for (
int i = 0; i < _IQTY; i++)
412 const _TYPE_C& operator *= (
TYPE nScale) noexcept
415 return *((_TYPE_C*)
this);
417 const _TYPE_C& operator /= (
TYPE nScale)
420 DoScale(((
TYPE)1) / nScale);
421 return *((_TYPE_C*)
this);
427 for (
int i = 0; i < _IQTY; i++)
432 _TYPE_C& operator *= (
const THIS_t& v2) noexcept
436 return *((_TYPE_C*)
this);
440 for (
int i = 0; i < _IQTY; i++)
449 return *((_TYPE_C*)
this);
457 template<
typename TYPE,
int _IQTY>
468 #pragma warning(disable:4201)
471 template<
typename TYPE = DVALUEDEF_t>
499 ::memcpy(m_a, &v,
sizeof(m_a));
503 ::memcpy(m_a, pVals,
sizeof(m_a));
521 template <
typename TYPE>
528 template<
typename TYPE = DVALUEDEF_t>
556 ::memcpy(m_a, &v,
sizeof(m_a));
560 if (pVals ==
nullptr)
562 ::memcpy(m_a, pVals,
sizeof(m_a));
565 : m_x(n0), m_y(n1), m_z(n2)
590 return m_x == pt.m_x && m_y == pt.m_y;
608 return(
Calc::Sqrt(GetDist2DSq(pt.m_x, pt.m_y)));
638 inline THIS_t
operator^(
const THIS_t& v2)
const
649 InitCross(oThis, v2);
654 template <
typename TYPE>
661 template<
typename TYPE = DVALUEDEF_t>
688 ::memcpy(m_a, &v,
sizeof(m_a));
692 if (pVals ==
nullptr)
694 ::memcpy(m_a, pVals,
sizeof(m_a));
697 : m_x(n0), m_y(n1), m_z(n2), m_w(n3)
701 : m_x(v2.GetElem(0)), m_y(v2.GetElem(1)), m_z(v2.GetElem(2)), m_w(_w)
736 this->x = v1.
y * (v2.
z * v3.
w - v3.
z * v2.
w) - v1.
z * (v2.
y * v3.
w - v3.
y * v2.
w) + v1.
w * (v2.
y * v3.
z - v2.
z *v3.
y);
737 this->y = -(v1.
x * (v2.
z * v3.
w - v3.
z * v2.
w) - v1.
z * (v2.
x * v3.
w - v3.
x * v2.
w) + v1.
w * (v2.
x * v3.
z - v3.
x * v2.
z));
738 this->z = v1.
x * (v2.
y * v3.
w - v3.
y * v2.
w) - v1.
y * (v2.
x *v3.
w - v3.
x * v2.
w) + v1.
w * (v2.
x * v3.
y - v3.
x * v2.
y);
739 this->w = -(v1.
x * (v2.
y * v3.
z - v3.
y * v2.
z) - v1.
y * (v2.
x * v3.
z - v3.
x *v2.
z) + v1.
z * (v2.
x * v3.
y - v3.
x * v2.
y));
744 template <
typename TYPE>
753 template class GRAYLIB_LINK cVecTC<float, 2, cVecT2<float> >;
755 template class GRAYLIB_LINK cVecTC<float, 3, cVecT3<float> >;
757 template class GRAYLIB_LINK cVecTC<float, 4, cVecT4<float> >;
760 template class GRAYLIB_LINK cVecTC<int, 2, cVecT2<int> >;
763 template class GRAYLIB_LINK cVecTC<double, 2, cVecT2<double> >;
765 template class GRAYLIB_LINK cVecTC<double, 3, cVecT3<double> >;
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define IS_INDEX_GOOD(i, q)
cast the (likely) int to unsigned to check for negatives.
Definition: Index.h:35
Using X files without the sources and the makefile How to use you just create a debug directory e g
Definition: Readme.txt:21
#define TYPE
Definition: StrT.cpp:38
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define DEBUG_CHECK(exp)
Definition: cDebugAssert.h:90
cVecT2(const TYPE *pVals)
Definition: cVecT.h:501
cVecT2() noexcept
Definition: cVecT.h:493
TYPE x
Definition: cVecT.h:490
cVecTC< TYPE, k_nDim, THIS_t > SUPER_t
Definition: cVecT.h:484
TYPE m_x
Definition: cVecT.h:489
const TYPE & get_X() const noexcept
Definition: cVecT.h:510
const TYPE & get_Y() const noexcept
Definition: cVecT.h:514
cVecT2(const SUPER_t &v) noexcept
Definition: cVecT.h:497
cVecT2(TYPE n0, TYPE n1) noexcept
Definition: cVecT.h:505
cVecT2< TYPE > THIS_t
Definition: cVecT.h:483
cVecT3(const TYPE *pVals) noexcept
Definition: cVecT.h:558
TYPE get_Z() const noexcept
Definition: cVecT.h:577
cVecT3(TYPE n0, TYPE n1, TYPE n2=0) noexcept
Definition: cVecT.h:564
TYPE GetDist2D(const THIS_t &pt) const
Definition: cVecT.h:606
void InitCross(const THIS_t &rA, const THIS_t &rB)
Definition: cVecT.h:611
THIS_t GetCross(const THIS_t &rB) const
Definition: cVecT.h:621
const cVecT2< TYPE > & get_V2() const noexcept
Definition: cVecT.h:582
cVecT3(const SUPER_t &v) noexcept
Definition: cVecT.h:554
cVecT3< TYPE > THIS_t
Definition: cVecT.h:538
TYPE m_z
Definition: cVecT.h:544
bool IsSame2D(const THIS_t &pt) const noexcept
Definition: cVecT.h:588
cVecTC< TYPE, k_nDim, THIS_t > SUPER_t
Definition: cVecT.h:539
TYPE GetDist2DSq(const THIS_t &pt) const
Definition: cVecT.h:599
TYPE m_x
Definition: cVecT.h:544
cVecT3() noexcept
Definition: cVecT.h:550
TYPE GetDist2DSq(TYPE nX, TYPE nY) const
Definition: cVecT.h:593
TYPE b
Definition: cVecT.h:546
static THIS_t GetCross(const THIS_t &rA, const THIS_t &rB)
Definition: cVecT.h:629
TYPE m_y
Definition: cVecT.h:544
TYPE get_X() const noexcept
Definition: cVecT.h:569
TYPE x
Definition: cVecT.h:545
void SetCross(const THIS_t &v2)
Definition: cVecT.h:645
TYPE get_Y() const noexcept
Definition: cVecT.h:573
TYPE m_w
Definition: cVecT.h:675
const TYPE & get_X() const noexcept
Definition: cVecT.h:705
TYPE z
Definition: cVecT.h:676
cVecT3< TYPE > & ref_V3() noexcept
Definition: cVecT.h:727
cVecT4(const TYPE *pVals) noexcept
Definition: cVecT.h:690
const TYPE & get_Z() const noexcept
Definition: cVecT.h:713
TYPE x
Definition: cVecT.h:676
cVecT4(const SUPER_t &v) noexcept
Definition: cVecT.h:686
void InitCross(const THIS_t &v1, const THIS_t &v2, const THIS_t &v3)
Definition: cVecT.h:733
TYPE a
Definition: cVecT.h:677
TYPE w
Definition: cVecT.h:676
const TYPE & get_Y() const noexcept
Definition: cVecT.h:709
const cVecT3< TYPE > & get_V3() const noexcept
Definition: cVecT.h:722
cVecT4(const cVecT3< TYPE > &v2, TYPE _w=0)
Definition: cVecT.h:700
cVecT4() noexcept
Definition: cVecT.h:682
TYPE y
Definition: cVecT.h:676
const TYPE & get_W() const noexcept
Definition: cVecT.h:717
cVecT4(TYPE n0, TYPE n1, TYPE n2=0, TYPE n3=0) noexcept
Definition: cVecT.h:696
default type for DVALUE_t in templates
Definition: cVecT.h:38
TYPE get_Magnitude() const noexcept
Definition: cVecT.h:129
void DoMul(const THIS_t &v2) noexcept
Definition: cVecT.h:423
bool isZero() const noexcept
Definition: cVecT.h:84
const _TYPE_C & get_CR() const noexcept
Definition: cVecT.h:59
COMPARE_t Compare(const THIS_t &v2) const noexcept
Definition: cVecT.h:95
_TYPE_C GetDiff(const THIS_t &v2) const
Definition: cVecT.h:170
TYPE GetDistSq(const THIS_t &v2) const
Definition: cVecT.h:243
static TYPE GetDot(const THIS_t &v1, const THIS_t &v2)
Definition: cVecT.h:271
TYPE GetElem(int i) const noexcept
Definition: cVecT.h:70
TYPE get_MagnitudeSq() const noexcept
Definition: cVecT.h:118
cVecTC< TYPE, _IQTY, _TYPE_C > THIS_t
Definition: cVecT.h:49
_TYPE_C GetDiv(const THIS_t &v2) const
Definition: cVecT.h:218
TYPE DVALUE_t
Dimension value type.
Definition: cVecT.h:48
void Set(const THIS_t &v)
Definition: cVecT.h:322
TYPE SetNormalized(void) noexcept
Definition: cVecT.h:334
_TYPE_C GetSum(const THIS_t &v2) const
Definition: cVecT.h:155
TYPE * get_T() noexcept
Definition: cVecT.h:51
const TYPE * get_CT() const noexcept
Definition: cVecT.h:55
TYPE & RefElem(int i) noexcept
Definition: cVecT.h:310
void SetLerp(const THIS_t &a, const THIS_t &b, DVALUE_t t)
Definition: cVecT.h:360
void SetZero() noexcept
Definition: cVecT.h:327
cVecTC()
Definition: cVecT.h:453
bool put_Magnitude(TYPE nLength)
Definition: cVecT.h:350
_TYPE_C get_Abs() const
Definition: cVecT.h:146
void DoDiv(const THIS_t &v2)
Definition: cVecT.h:438
_TYPE_C GetScaled(TYPE nScale) const
Definition: cVecT.h:184
_TYPE_C get_Normalized() const
Definition: cVecT.h:283
void DoScale(TYPE n) noexcept
Definition: cVecT.h:404
TYPE GetDot(const THIS_t &v2) const
Definition: cVecT.h:255
bool IsNear(const THIS_t &v2, TYPE fDist=(TYPE) k_FLT_MIN2) const
Definition: cVecT.h:108
_TYPE_C GetMul(const THIS_t &v2) const
Definition: cVecT.h:205
TYPE GetDist(const THIS_t &v2) const
Definition: cVecT.h:249
cVecT2< TYPE > operator*(const TYPE nVal, const cVecT2< TYPE > &v2)
Definition: cVecT.h:522
float DVALUEDEF_t
similar to D3DVALUE in DX. the basic default dimension type. DVALUEDEF_t
Definition: cVecT.h:34
cVecT2< float > cFloat2
Definition: cVecT.h:519
cVecT4< float > cFloat4
Definition: cVecT.h:742
cVecT3< float > cFloat3
Definition: cVecT.h:652
GINTERSECT_TYPE
Definition: cVecT.h:20
@ GINTERSECT_In2
object1 fully inside object2.
Definition: cVecT.h:29
@ GINTERSECT_Error
Error or Not init.
Definition: cVecT.h:30
@ GINTERSECT_In1
object2 fully inside (or equal to) object1 (the main search comparator). CONTAINS
Definition: cVecT.h:28
@ GINTERSECT_Partial
object2 partly inside object1. partial intersection. INTERSECTS
Definition: cVecT.h:27
@ GINTERSECT_None
object2 completely outside object1 (no intersection) DISJOINT
Definition: cVecT.h:26
int COMPARE_t
result of compare. 0=same, 1=a>b, -1=a<b
Definition: cValT.h:17
cUInt64 operator^(const cUInt64 &roUI64_1, const cUInt64 &roUI64_2)
Definition: cUInt64.h:391
cStringA operator+(const char *pStr1, const cStringA &s2)
Definition: cString.h:642
bool operator!=(const cTimeDouble &dt1, const cTimeDouble &dt2)
Definition: cTimeDouble.h:254
bool operator==(const cTimeDouble &dt1, const cTimeDouble &dt2)
Definition: cTimeDouble.h:250
static TYPE Abs(TYPE a) noexcept
similar to ABS(n) macro. Does nothing for unsigned types.
static bool IsNear(TYPE n1, TYPE n2, TYPE nDiff=(TYPE) k_FLT_MIN2) noexcept
Definition: Calc.h:135
static TYPE Sqr(TYPE a) noexcept
Definition: Calc.h:141
static TYPE Sqrt(TYPE a)
Definition: Calc.h:430
static TYPE Lerp(TYPE nVal1, TYPE nVal2, TYPE fRatio) noexcept
Definition: Calc.h:400
static void Zero(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:100