3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
8 * See LICENSING which should be included
9 * along with this file for more details
12 #ifndef __FELIB_V2_H__
13 #define __FELIB_V2_H__
33 /* Standard structure for representing positions */
36 v2 (int X
, int Y
) : X(X
), Y(Y
) {}
37 v2
operator + (v2 V
) const { return v2(X
+V
.X
, Y
+V
.Y
); }
38 v2
&operator += (v2 V
) { X
+= V
.X
; Y
+= V
.Y
; return *this; }
39 v2
operator - (v2 V
) const { return v2(X
-V
.X
, Y
-V
.Y
); }
40 v2
&operator -= (v2 V
) { X
-= V
.X
; Y
-= V
.Y
; return *this; }
41 v2
operator - () const { return v2(-X
, -Y
); }
42 v2
operator * (int I
) const { return v2(X
*I
, Y
*I
); }
43 v2
&operator *= (int I
) { X
*= I
; Y
*= I
; return *this; }
44 v2
operator / (int I
) const { return v2(X
/I
, Y
/I
); }
45 v2
&operator /= (int I
) { X
/= I
; Y
/= I
; return *this; }
46 v2
operator * (double D
) const { return v2(int(X
*D
), int(Y
*D
)); }
47 v2
&operator *= (double D
) { X
= int(X
*D
); Y
= int(Y
*D
); return *this; }
48 v2
operator / (double D
) const { return v2(int(X
/D
), int(Y
/D
)); }
49 v2
&operator /= (double D
) { X
= int(X
/D
); Y
= int(Y
/D
); return *this; }
50 truth
operator == (v2 V
) const { return X
== V
.X
&& Y
== V
.Y
; }
51 truth
operator != (v2 V
) const { return X
!= V
.X
|| Y
!= V
.Y
; }
52 v2
operator << (int S
) const { return v2(X
<< S
, Y
<< S
); }
53 v2
&operator <<= (int S
) { X
<<= S
; Y
<<= S
; return *this; }
54 v2
operator >> (int S
) const { return v2(X
>> S
, Y
>> S
); }
55 v2
&operator >>= (int S
) { X
>>= S
; Y
>>= S
; return *this; }
56 bool operator < (v2 V
) const { return X
< V
.X
|| (X
== V
.X
&& Y
< V
.Y
); }
57 int GetLengthSquare() const { return X
*X
+Y
*Y
; }
58 /* Also returns true if V == *this */
59 truth
IsAdjacent (v2 V
) const { return V
.X
>= X
-1 && V
.X
<= X
+1 && V
.Y
<= Y
+1 && V
.Y
>= Y
-1; }
60 int GetManhattanLength () const { return Max(abs(X
), abs(Y
)); }
61 truth
Is0 () const { return X
== 0 && Y
== 0; }
62 operator packv2 () const {
63 packv2 V
= { (short)X
, (short)Y
};
66 operator podv2 () const {
70 // v2 Randomize() const; Would be a good idea.
74 inline packv2::operator v2 () const { return v2(X
, Y
); }
75 inline podv2::operator v2 () const { return v2(X
, Y
); }
79 * Rotates a position Vect of a square map of size
80 * Size x Size according to Flags (see felibdef.h)
82 inline void Rotate (v2
&Vect
, int Size
, int Flags
) {
86 Vect
.X
= Limit
-Vect
.Y
;
89 if (Flags
& MIRROR
) Vect
.X
= Limit
-Vect
.X
;
90 if (Flags
& FLIP
) Vect
.Y
= Limit
-Vect
.Y
;
94 cv2
ERROR_V2(-0x8000, -0x8000);
95 cv2
ABORT_V2(-0x7FFF, -0x7FFF);