directions.hh (4250B)
1 #ifndef _GEOMETRY_DIRECTIONS_HH_ 2 #define _GEOMETRY_DIRECTIONS_HH_ 3 4 class EnsembleCardinaux { 5 protected: 6 char v; 7 EnsembleCardinaux(char _v) : v(_v) {} 8 public: 9 friend EnsembleCardinaux operator| (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) { 10 return EnsembleCardinaux(ec1.v | ec2.v); 11 } 12 friend EnsembleCardinaux operator& (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) { 13 return EnsembleCardinaux(ec1.v & ec2.v); 14 } 15 friend bool operator== (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) { 16 return (ec1.v == ec2.v); 17 } 18 friend bool operator!= (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) { 19 return (ec1.v != ec2.v); 20 } 21 }; 22 23 class Cardinal : public EnsembleCardinaux { 24 private: 25 static const char rotationTable[9]; 26 public: 27 Cardinal(int x) : EnsembleCardinaux((char)(1 << (x & 3))) {} 28 operator int () const { 29 return rotationTable[(int)v]; 30 } 31 friend Cardinal operator+ (const Cardinal c, const int n) { 32 return Cardinal(rotationTable[(int)c.v] + n); 33 } 34 friend Cardinal operator- (const Cardinal c, const int n) { 35 return Cardinal(rotationTable[(int)c.v] - n); 36 } 37 }; 38 39 const Cardinal N = Cardinal(0); 40 const Cardinal E = Cardinal(1); 41 const Cardinal S = Cardinal(2); 42 const Cardinal W = Cardinal(3); 43 44 // Plus ou moins la même chose que Cardinal. 45 class Coin { 46 private: 47 char v; 48 static const char rotationTable[9]; 49 public: 50 Coin(int x) : v((char)(1 << (x & 3))) {} 51 operator int () const { 52 return (int)rotationTable[(int)v]; 53 } 54 friend Coin operator+ (const Coin c, const int n) { 55 return Coin(rotationTable[(int)c.v] + n); 56 } 57 friend Coin operator- (const Coin c, const int n) { 58 return Coin(rotationTable[(int)c.v] - n); 59 } 60 friend bool operator== (const Coin c1, const Coin c2) { 61 return (c1.v == c2.v); 62 } 63 friend bool operator!= (const Coin c1, const Coin c2) { 64 return (c1.v != c2.v); 65 } 66 }; 67 68 const Coin NE = Coin(0); 69 const Coin SE = Coin(1); 70 const Coin SW = Coin(2); 71 const Coin NW = Coin(3); 72 73 // Pour les triangles, c'est quasiment identique, il y a sûrement moyen de factoriser ça. 74 75 class EnsembleCotesTriangle { 76 protected: 77 char v; 78 EnsembleCotesTriangle(char _v) : v(_v) {} 79 public: 80 friend EnsembleCotesTriangle operator| (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) { 81 return EnsembleCotesTriangle(ec1.v | ec2.v); 82 } 83 friend EnsembleCotesTriangle operator& (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) { 84 return EnsembleCotesTriangle(ec1.v & ec2.v); 85 } 86 friend bool operator== (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) { 87 return (ec1.v == ec2.v); 88 } 89 friend bool operator!= (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) { 90 return (ec1.v != ec2.v); 91 } 92 }; 93 94 class CoteTriangle : public EnsembleCotesTriangle { 95 private: 96 static const char rotationTable[5]; 97 public: 98 CoteTriangle(int x) : EnsembleCotesTriangle((char)(1 << (((x % 3) + 3) % 3))) {} 99 operator int () const { 100 return rotationTable[(int)v]; 101 } 102 friend CoteTriangle operator+ (const CoteTriangle c, const int n) { 103 return CoteTriangle(rotationTable[(int)c.v] + n); 104 } 105 friend CoteTriangle operator- (const CoteTriangle c, const int n) { 106 return CoteTriangle(rotationTable[(int)c.v] - n); 107 } 108 }; 109 110 const CoteTriangle LEFTSIDE = CoteTriangle(0); 111 const CoteTriangle RIGHTSIDE = CoteTriangle(1); 112 const CoteTriangle BASE = CoteTriangle(2); 113 114 // Plus ou moins la même chose que CoteTriangle. 115 class SommetTriangle { 116 private: 117 char v; 118 static const char rotationTable[5]; 119 public: 120 SommetTriangle(int x) : v((char)(1 << (((x % 3) + 3) % 3))) {} 121 operator int () const { 122 return (int)rotationTable[(int)v]; 123 } 124 friend SommetTriangle operator+ (const SommetTriangle c, const int n) { 125 return SommetTriangle(rotationTable[(int)c.v] + n); 126 } 127 friend SommetTriangle operator- (const SommetTriangle c, const int n) { 128 return SommetTriangle(rotationTable[(int)c.v] - n); 129 } 130 friend bool operator== (const SommetTriangle c1, const SommetTriangle c2) { 131 return (c1.v == c2.v); 132 } 133 friend bool operator!= (const SommetTriangle c1, const SommetTriangle c2) { 134 return (c1.v != c2.v); 135 } 136 }; 137 138 const SommetTriangle LEFT = SommetTriangle(0); 139 const SommetTriangle TOP = SommetTriangle(1); 140 const SommetTriangle RIGHT = SommetTriangle(2); 141 142 #endif