point.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // 2D Points
  4. //
  5. //////////////////////////////////////////////////////////////////////////////
  6. #ifndef _Point_H_
  7. #define _Point_H_
  8. //////////////////////////////////////////////////////////////////////////////
  9. //
  10. // Template Points
  11. //
  12. //////////////////////////////////////////////////////////////////////////////
  13. template <class PointType>
  14. class TPoint : public PointType {
  15. public:
  16. TPoint() {}
  17. TPoint(VSNET_TNFIX PointType::Number x, VSNET_TNFIX PointType::Number y) :
  18. PointType(x, y)
  19. {}
  20. static TPoint GetZero() { return TPoint(0, 0); }
  21. template<class Type>
  22. static TPoint Cast(const TPoint<Type>& point)
  23. {
  24. return
  25. TPoint(
  26. (PointType::Number)point.X(),
  27. (PointType::Number)point.Y()
  28. );
  29. }
  30. TPoint& operator+=(const TPoint& pt) {
  31. SetX(X() + pt.X());
  32. SetY(Y() + pt.Y());
  33. return *this;
  34. }
  35. // , there should really be a Vector2 class
  36. VSNET_TNFIX PointType::Number LengthSquared() const
  37. {
  38. return X() * X() + Y() * Y();
  39. }
  40. VSNET_TNFIX PointType::Number Length() const
  41. {
  42. if (LengthSquared() == 1) {
  43. return 1;
  44. } else {
  45. return (PointType::Number)sqrt((float)LengthSquared());
  46. }
  47. }
  48. ZString GetString() const
  49. {
  50. return ZString("(") + ZString(X()) + ", " + ZString(Y()) + ")";
  51. }
  52. friend TPoint operator*(VSNET_TNFIX PointType::Number value, const TPoint& p1)
  53. {
  54. return TPoint(p1.X() * value, p1.Y() * value);
  55. }
  56. friend TPoint operator*(const TPoint& p1, VSNET_TNFIX PointType::Number value)
  57. {
  58. return TPoint(p1.X() * value, p1.Y() * value);
  59. }
  60. friend TPoint operator/(const TPoint& p1, VSNET_TNFIX PointType::Number value)
  61. {
  62. return TPoint(p1.X() / value, p1.Y() / value);
  63. }
  64. friend TPoint operator+(const TPoint& p1, const TPoint& p2)
  65. {
  66. return TPoint(p1.X() + p2.X(), p1.Y() + p2.Y());
  67. }
  68. friend TPoint operator-(const TPoint& p1)
  69. {
  70. return TPoint(-p1.X(), -p1.Y());
  71. }
  72. friend TPoint operator-(const TPoint& p1, const TPoint& p2)
  73. {
  74. return TPoint(p1.X() - p2.X(), p1.Y() - p2.Y());
  75. }
  76. friend bool operator==(const TPoint& p1, const TPoint& p2)
  77. {
  78. return p1.X() == p2.X() && p1.Y() == p2.Y();
  79. }
  80. friend bool operator!=(const TPoint& p1, const TPoint& p2)
  81. {
  82. return p1.X() != p2.X() || p1.Y() != p2.Y();
  83. }
  84. };
  85. //////////////////////////////////////////////////////////////////////////////
  86. //
  87. // Windows Points
  88. //
  89. //////////////////////////////////////////////////////////////////////////////
  90. class WinPointCore : public POINT {
  91. protected:
  92. typedef int Number;
  93. public:
  94. WinPointCore() {}
  95. WinPointCore(Number xArg, Number yArg)
  96. {
  97. x = xArg;
  98. y = yArg;
  99. }
  100. Number X() const { return x; }
  101. Number Y() const { return y; }
  102. void SetX(Number xArg) { x = xArg; }
  103. void SetY(Number yArg) { y = yArg; }
  104. };
  105. typedef TPoint<WinPointCore> WinPoint;
  106. inline ZString GetString(const WinPoint& point)
  107. {
  108. return "(" + ZString(point.X()) + ", " + ZString(point.Y()) + ")";
  109. }
  110. //////////////////////////////////////////////////////////////////////////////
  111. //
  112. // floating point Points
  113. //
  114. //////////////////////////////////////////////////////////////////////////////
  115. class PointCore {
  116. protected:
  117. typedef float Number;
  118. private:
  119. Number m_x;
  120. Number m_y;
  121. public:
  122. PointCore() {}
  123. PointCore(Number x, Number y) :
  124. m_x(x),
  125. m_y(y)
  126. {}
  127. Number X() const { return m_x; }
  128. Number Y() const { return m_y; }
  129. void SetX(Number x) { m_x = x; }
  130. void SetY(Number y) { m_y = y; }
  131. operator POINT()
  132. {
  133. POINT pt;
  134. pt.x = (int)m_x;
  135. pt.y = (int)m_y;
  136. return pt;
  137. }
  138. };
  139. typedef TPoint<PointCore> Point;
  140. inline ZString GetString(const Point& point)
  141. {
  142. return "(" + ZString(point.X()) + ", " + ZString(point.Y()) + ")";
  143. }
  144. #endif