30 void Set(
KyInt32* coords) { x = coords[0]; y = coords[1]; }
39 bool operator==(
const Vec2i& v)
const {
return x == v.x && y == v.y; }
40 bool operator!=(
const Vec2i& v)
const {
return !operator==(v); }
42 bool operator<(
const Vec2i& v)
const {
return (x != v.x) ? x < v.x : y < v.y; }
43 bool operator<=(
const Vec2i& v)
const {
return (x != v.x) ? x < v.x : y <= v.y; }
44 bool operator>(
const Vec2i& v)
const {
return (x != v.x) ? x > v.x : y > v.y; }
45 bool operator>=(
const Vec2i& v)
const {
return (x != v.x) ? x < v.x : y >= v.y; }
47 Vec2i& operator*=(
KyInt32 s) { x *= s; y *= s;
return *
this; }
48 Vec2i& operator/=(
KyInt32 d) { x /= d; y /= d;
return *
this; }
49 Vec2i& operator+=(
const Vec2i& v) { x += v.x; y += v.y;
return *
this; }
50 Vec2i& operator-=(
const Vec2i& v) { x -= v.x; y -= v.y;
return *
this; }
54 Vec2i operator+(
const Vec2i& v)
const {
return Vec2i(x + v.x, y + v.y); }
55 Vec2i operator-(
const Vec2i& v)
const {
return Vec2i(x - v.x, y - v.y); }
56 Vec2i operator-()
const {
return Vec2i(-x , -y ); }
61 KyInt64 SqLength_15bits()
const {
return x * x + y * y; }
62 bool IsZero()
const {
return x == 0 && y == 0; }
79 bool IsOnLeftSide(
const Vec2i& A,
const Vec2i& B)
const {
return Orient2d(A, B) >= 0; }
80 bool IsStrictlyOnLeftSide(
const Vec2i& A,
const Vec2i& B)
const {
return Orient2d(A, B) > 0; }
84 bool IsInsideTriangle(
const Vec2i& A,
const Vec2i& B,
const Vec2i& C)
const;
85 bool IsInsideNotColinearTriangle(
const Vec2i& A,
const Vec2i& B,
const Vec2i& C)
const;
86 bool IsStrictlyInsideTriangle(
const Vec2i& A,
const Vec2i& B,
const Vec2i& C)
const;
96 Vec2i NeighborEast()
const {
return Vec2i(x + 1, y ); }
97 Vec2i NeighborWest()
const {
return Vec2i(x - 1, y ); }
98 Vec2i NeighborNorth()
const {
return Vec2i(x , y + 1); }
99 Vec2i NeighborSouth()
const {
return Vec2i(x , y - 1); }
101 void NeighborEast(
Vec2i& neighbor)
const { neighbor.Set(x + 1, y ); }
102 void NeighborWest(
Vec2i& neighbor)
const { neighbor.Set(x - 1, y ); }
103 void NeighborNorth(
Vec2i& neighbor)
const { neighbor.Set(x , y + 1); }
104 void NeighborSouth(
Vec2i& neighbor)
const { neighbor.Set(x , y - 1); }
108 const KyInt8 dx[4] = { 1, 0, -1, 0 };
109 const KyInt8 dy[4] = { 0, 1, 0, -1 };
110 return Vec2i(x + dx[dir], y + dy[dir]);
115 const KyInt8 dx[4] = {1, 0, -1, 0};
116 const KyInt8 dy[4] = {0, 1, 0, -1};
117 neighbor.Set(x + dx[dir], y + dy[dir]);
120 Vec2i NeighborNorthEast()
const {
return Vec2i(x + 1, y + 1); }
121 Vec2i NeighborNorthWest()
const {
return Vec2i(x - 1, y + 1); }
122 Vec2i NeighborSouthEast()
const {
return Vec2i(x + 1, y - 1); }
123 Vec2i NeighborSouthWest()
const {
return Vec2i(x - 1, y - 1); }
133 SwapEndianness(e,
self.x);
134 SwapEndianness(e,
self.y);
137 inline Vec2i Seg(
const Vec2i& A,
const Vec2i& B) {
return B - A; }
141 inline KyInt32 DotProduct_15bits(
const Vec2i& v1,
const Vec2i& v2) {
return v1.x * v2.x + v1.y * v2.y; }
142 inline KyInt32 CrossProduct_15bits(
const Vec2i& v1,
const Vec2i& v2) {
return v1.x * v2.y - v1.y * v2.x; }
147 inline bool AreAligned(
const Vec2i& A,
const Vec2i& B,
const Vec2i& C) {
return CrossProduct(B - A, C - A) == 0; }
152 inline bool Vec2i::IsInsideTriangle(
const Vec2i& A,
const Vec2i& B,
const Vec2i& C)
const
154 if (AreAligned(A, B, C) == 0)
156 if (A.x == B.x && A.x == C.x)
158 if (y < A.y && y < B.y && y < C.y) {
return false; }
159 if (y > A.y && y > B.y && y > C.y) {
return false; }
164 if (x < A.x && x < B.x && x < C.x) {
return false; }
165 if (x > A.x && x > B.x && x > C.x) {
return false; }
170 return IsInsideNotColinearTriangle(A, B, C);
174 inline bool Vec2i::IsInsideNotColinearTriangle(
const Vec2i& A,
const Vec2i& B,
const Vec2i& C)
const
176 return IsOnLeftSide(A, B) && IsOnLeftSide(B, C) && IsOnLeftSide(C, A);
180 inline bool Vec2i::IsStrictlyInsideTriangle(
const Vec2i& A,
const Vec2i& B,
const Vec2i& C)
const
182 return IsStrictlyOnLeftSide(A, B) && IsStrictlyOnLeftSide(B, C) && IsStrictlyOnLeftSide(C, A);
185 template <
class OSTREAM>
186 inline OSTREAM& operator<<(OSTREAM& os,
const Kaim::Vec2i& v)
188 os <<
"{" << v.x <<
"," << v.y <<
"}";
void Set(KyInt32 *coords)
Sets x=coords[0], y=coords[1].
Definition: vec2i.h:30
bool operator<(const Vec2i &v) const
x is compared first. ex: {1, 5} < {2,="" 0}.="" />
Definition: vec2i.h:42
KyInt64 Lsign(KyInt64 x)
return -1 if x<0, 0="" if="" x="=0," 1="" if="" x="">0 0,>
Definition: fastmath.h:43
void Set(KyInt32 _x, KyInt32 _y)
Sets x=_x and y=_y.
Definition: vec2i.h:29
KyUInt32 CardinalDir
Defines a type that refers to one of the cardinal points on the compass:
Definition: cardinaldir.h:15
KyFloat32 SquareDistance(const Vec2f &A, const Vec2f &B)
Returns the square of the distance between A and B.
Definition: vec2f.h:130
Vec2i OffsetY(KyInt32 dy) const
Returns {x, y + dy}.
Definition: vec2i.h:67
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
Vec2i Offset(KyInt32 dx, KyInt32 dy) const
Returns {x + dx, y + dy}.
Definition: vec2i.h:68
Target
Enumerates the possible endianness types relative to the current platform.
Definition: endianness.h:27
std::int64_t KyInt64
int64_t
Definition: types.h:25
Vec2i(KyInt32 *coords)
Constructs x=coords[0], y=coords[1].
Definition: vec2i.h:27
KyInt32 Side(const Vec2i &P, const Vec2i &A, const Vec2i &B)
P relative to AB: left=1, on=0, right=-1.
Definition: vec2i.h:150
2d vector using KyInt32
Definition: vec2i.h:18
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24
void Clear()
Sets x = 0 and y = 0.
Definition: vec2i.h:32
KyInt64 Orient2d(const Vec2i &A, const Vec2i &B) const
CrossProduct(MA, MB) where M=*this.
Definition: vec2i.h:78
std::int8_t KyInt8
int8_t
Definition: types.h:22
Vec2i(KyInt32 _x, KyInt32 _y)
Constructs x=_x, y=_y.
Definition: vec2i.h:26
Vec2i()
Constructs x=0.0f, y=0.0f.
Definition: vec2i.h:25
Vec2i OffsetX(KyInt32 dx) const
Returns {x + dx, y}.
Definition: vec2i.h:66