/BOSS/source/Position.hpp

https://github.com/davechurchill/ualbertabot · C++ Header · 181 lines · 145 code · 35 blank · 1 comment · 12 complexity · 02435ea02d31a2c9026668f3a2fff13d MD5 · raw file

  1. #pragma once
  2. #include "Common.h"
  3. #include <sstream>
  4. typedef int PositionType;
  5. namespace BOSS
  6. {
  7. class Position
  8. {
  9. PositionType _x;
  10. PositionType _y;
  11. public:
  12. Position()
  13. : _x(0)
  14. , _y(0)
  15. {
  16. }
  17. Position(const PositionType & x, const PositionType & y)
  18. : _x(x)
  19. , _y(y)
  20. {
  21. }
  22. const bool operator < (const Position & rhs) const
  23. {
  24. return (x() < rhs.x()) || ((x() == rhs.x()) && y() < rhs.y());
  25. }
  26. const bool operator == (const Position & rhs) const
  27. {
  28. return x() == rhs.x() && y() == rhs.y();
  29. }
  30. const Position operator + (const Position & rhs) const
  31. {
  32. return Position(x() + rhs.x(), y() + rhs.y());
  33. }
  34. const Position operator - (const Position & rhs) const
  35. {
  36. return Position(x() - rhs.x(), y() - rhs.y());
  37. }
  38. const Position operator / (const PositionType & d) const
  39. {
  40. return Position(_x / d, _y / d);
  41. }
  42. const Position operator * (const PositionType & d) const
  43. {
  44. return Position(_x * d, _y * d);
  45. }
  46. const Position scale(const float & f) const
  47. {
  48. return Position((PositionType)(f * x()), (PositionType)(f * y()));
  49. }
  50. void scalePosition(const float & f)
  51. {
  52. _x = (PositionType)(f * _x);
  53. _y = (PositionType)(f * _y);
  54. }
  55. void add(const Position & rhs)
  56. {
  57. _x += rhs.x();
  58. _y += rhs.y();
  59. }
  60. void subtract(const Position & rhs)
  61. {
  62. _x -= rhs.x();
  63. _y -= rhs.y();
  64. }
  65. void moveTo(const Position & pos)
  66. {
  67. _x = pos.x();
  68. _y = pos.y();
  69. }
  70. void add(const PositionType & x, const PositionType & y)
  71. {
  72. _x += x;
  73. _y += y;
  74. }
  75. void moveTo(const PositionType & x, const PositionType & y)
  76. {
  77. _x = x;
  78. _y = y;
  79. }
  80. const PositionType x() const
  81. {
  82. return _x;
  83. }
  84. const PositionType y() const
  85. {
  86. return _y;
  87. }
  88. const Position flipX() const
  89. {
  90. return Position(-_x,_y);
  91. }
  92. const Position flipY() const
  93. {
  94. return Position(_y,_x);
  95. }
  96. const float Q_rsqrt( float number ) const
  97. {
  98. long i;
  99. float x2, y;
  100. const float threehalfs = 1.5F;
  101. x2 = number * 0.5F;
  102. y = number;
  103. i = * ( long * ) &y; // evil floating point bit level hacking
  104. i = 0x5f3759df - ( i >> 1 );
  105. y = * ( float * ) &i;
  106. y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
  107. // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
  108. return y;
  109. }
  110. const Position flip() const
  111. {
  112. return Position(-_x, -_y);
  113. }
  114. inline const PositionType getDistance(const Position & p) const
  115. {
  116. PositionType dX = x() - p.x();
  117. PositionType dY = y() - p.y();
  118. if (dX == 0)
  119. {
  120. return abs(dY);
  121. }
  122. else if (dY == 0)
  123. {
  124. return abs(dX);
  125. }
  126. else
  127. {
  128. return (PositionType)sqrt((float)(dX*dX - dY*dY));
  129. }
  130. }
  131. inline const PositionType getDistanceSq(const Position & p) const
  132. {
  133. return (x()-p.x())*(x()-p.x()) + (y()-p.y())*(y()-p.y());
  134. }
  135. void print() const
  136. {
  137. printf("Position = (%d, %d)\n", _x, _y);
  138. }
  139. const std::string getString() const
  140. {
  141. std::stringstream ss;
  142. ss << "(" << x() << ", " << y() << ")";
  143. return ss.str();
  144. }
  145. };
  146. }