143 lines
4.2 KiB
C++
143 lines
4.2 KiB
C++
#ifndef _GEOMETRY_DIRECTIONS_HH_
|
|
#define _GEOMETRY_DIRECTIONS_HH_
|
|
|
|
class EnsembleCardinaux {
|
|
protected:
|
|
char v;
|
|
EnsembleCardinaux(char _v) : v(_v) {}
|
|
public:
|
|
friend EnsembleCardinaux operator| (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
|
|
return EnsembleCardinaux(ec1.v | ec2.v);
|
|
}
|
|
friend EnsembleCardinaux operator& (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
|
|
return EnsembleCardinaux(ec1.v & ec2.v);
|
|
}
|
|
friend bool operator== (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
|
|
return (ec1.v == ec2.v);
|
|
}
|
|
friend bool operator!= (const EnsembleCardinaux ec1, const EnsembleCardinaux ec2) {
|
|
return (ec1.v != ec2.v);
|
|
}
|
|
};
|
|
|
|
class Cardinal : public EnsembleCardinaux {
|
|
private:
|
|
static const char rotationTable[9];
|
|
public:
|
|
Cardinal(int x) : EnsembleCardinaux((char)(1 << (x & 3))) {}
|
|
operator int () const {
|
|
return rotationTable[(int)v];
|
|
}
|
|
friend Cardinal operator+ (const Cardinal c, const int n) {
|
|
return Cardinal(rotationTable[(int)c.v] + n);
|
|
}
|
|
friend Cardinal operator- (const Cardinal c, const int n) {
|
|
return Cardinal(rotationTable[(int)c.v] - n);
|
|
}
|
|
};
|
|
|
|
const Cardinal N = Cardinal(0);
|
|
const Cardinal E = Cardinal(1);
|
|
const Cardinal S = Cardinal(2);
|
|
const Cardinal W = Cardinal(3);
|
|
|
|
// Plus ou moins la même chose que Cardinal.
|
|
class Coin {
|
|
private:
|
|
char v;
|
|
static const char rotationTable[9];
|
|
public:
|
|
Coin(int x) : v((char)(1 << (x & 3))) {}
|
|
operator int () const {
|
|
return (int)rotationTable[(int)v];
|
|
}
|
|
friend Coin operator+ (const Coin c, const int n) {
|
|
return Coin(rotationTable[(int)c.v] + n);
|
|
}
|
|
friend Coin operator- (const Coin c, const int n) {
|
|
return Coin(rotationTable[(int)c.v] - n);
|
|
}
|
|
friend bool operator== (const Coin c1, const Coin c2) {
|
|
return (c1.v == c2.v);
|
|
}
|
|
friend bool operator!= (const Coin c1, const Coin c2) {
|
|
return (c1.v != c2.v);
|
|
}
|
|
};
|
|
|
|
const Coin NE = Coin(0);
|
|
const Coin SE = Coin(1);
|
|
const Coin SW = Coin(2);
|
|
const Coin NW = Coin(3);
|
|
|
|
// Pour les triangles, c'est quasiment identique, il y a sûrement moyen de factoriser ça.
|
|
|
|
class EnsembleCotesTriangle {
|
|
protected:
|
|
char v;
|
|
EnsembleCotesTriangle(char _v) : v(_v) {}
|
|
public:
|
|
friend EnsembleCotesTriangle operator| (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
|
|
return EnsembleCotesTriangle(ec1.v | ec2.v);
|
|
}
|
|
friend EnsembleCotesTriangle operator& (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
|
|
return EnsembleCotesTriangle(ec1.v & ec2.v);
|
|
}
|
|
friend bool operator== (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
|
|
return (ec1.v == ec2.v);
|
|
}
|
|
friend bool operator!= (const EnsembleCotesTriangle ec1, const EnsembleCotesTriangle ec2) {
|
|
return (ec1.v != ec2.v);
|
|
}
|
|
};
|
|
|
|
class CoteTriangle : public EnsembleCotesTriangle {
|
|
private:
|
|
static const char rotationTable[5];
|
|
public:
|
|
CoteTriangle(int x) : EnsembleCotesTriangle((char)(1 << (((x % 3) + 3) % 3))) {}
|
|
operator int () const {
|
|
return rotationTable[(int)v];
|
|
}
|
|
friend CoteTriangle operator+ (const CoteTriangle c, const int n) {
|
|
return CoteTriangle(rotationTable[(int)c.v] + n);
|
|
}
|
|
friend CoteTriangle operator- (const CoteTriangle c, const int n) {
|
|
return CoteTriangle(rotationTable[(int)c.v] - n);
|
|
}
|
|
};
|
|
|
|
const CoteTriangle LEFTSIDE = CoteTriangle(0);
|
|
const CoteTriangle RIGHTSIDE = CoteTriangle(1);
|
|
const CoteTriangle BASE = CoteTriangle(2);
|
|
|
|
// Plus ou moins la même chose que CoteTriangle.
|
|
class SommetTriangle {
|
|
private:
|
|
char v;
|
|
static const char rotationTable[5];
|
|
public:
|
|
SommetTriangle(int x) : v((char)(1 << (((x % 3) + 3) % 3))) {}
|
|
operator int () const {
|
|
return (int)rotationTable[(int)v];
|
|
}
|
|
friend SommetTriangle operator+ (const SommetTriangle c, const int n) {
|
|
return SommetTriangle(rotationTable[(int)c.v] + n);
|
|
}
|
|
friend SommetTriangle operator- (const SommetTriangle c, const int n) {
|
|
return SommetTriangle(rotationTable[(int)c.v] - n);
|
|
}
|
|
friend bool operator== (const SommetTriangle c1, const SommetTriangle c2) {
|
|
return (c1.v == c2.v);
|
|
}
|
|
friend bool operator!= (const SommetTriangle c1, const SommetTriangle c2) {
|
|
return (c1.v != c2.v);
|
|
}
|
|
};
|
|
|
|
const SommetTriangle LEFT = SommetTriangle(0);
|
|
const SommetTriangle TOP = SommetTriangle(1);
|
|
const SommetTriangle RIGHT = SommetTriangle(2);
|
|
|
|
#endif
|