/SparCraft/source/Position.hpp

https://github.com/davechurchill/ualbertabot · C++ Header · 176 lines · 142 code · 32 blank · 2 comment · 12 complexity · 84314aef062dc7ea8dbe0a91786c8bb5 MD5 · raw file

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