moved almost all hardcoded constants to "define.dat"
[k8-i-v-a-n.git] / src / felib / v2.h
blob625c84205ab1bb57672f2f2ec52a02a0be2f5e6d
1 /*
3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
6 * Public License
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__
15 #include <cstdlib>
17 #include "felibdef.h"
20 struct v2;
22 struct packv2 {
23 operator v2 () const;
24 short X, Y;
27 struct podv2 {
28 operator v2 () const;
29 int X, Y;
33 /* Standard structure for representing positions */
34 struct v2 {
35 v2 () {}
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 };
64 return V;
66 operator podv2 () const {
67 podv2 V = { X, Y };
68 return V;
70 // v2 Randomize() const; Would be a good idea.
71 int X, Y;
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) {
83 cint Limit = Size-1;
84 if (Flags & ROTATE) {
85 cint T = Vect.X;
86 Vect.X = Limit-Vect.Y;
87 Vect.Y = T;
89 if (Flags & MIRROR) Vect.X = Limit-Vect.X;
90 if (Flags & FLIP) Vect.Y = Limit-Vect.Y;
93 cv2 ZERO_V2(0, 0);
94 cv2 ERROR_V2(-0x8000, -0x8000);
95 cv2 ABORT_V2(-0x7FFF, -0x7FFF);
98 #endif