diff options
author | vng <viktor.govako@gmail.com> | 2012-06-19 04:51:53 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:39:57 +0300 |
commit | 390428f5c6c0bcab541a688d5bca314197b12fd2 (patch) | |
tree | 51a92c6ec3ec2e7cb6f1fabac9aa34f42beb726c /geometry | |
parent | 06bf51c0b95530c1d3c88dc108e101a62a91c61d (diff) |
- Code style changes.
- Remove Rect<T>::operator< (???).
- Add IsEqual for rects with epsilon.
Diffstat (limited to 'geometry')
-rw-r--r-- | geometry/angles.hpp | 14 | ||||
-rw-r--r-- | geometry/any_rect2d.hpp | 21 | ||||
-rw-r--r-- | geometry/rect2d.hpp | 16 |
3 files changed, 35 insertions, 16 deletions
diff --git a/geometry/angles.hpp b/geometry/angles.hpp index d56677a418..39285b7d27 100644 --- a/geometry/angles.hpp +++ b/geometry/angles.hpp @@ -1,27 +1,25 @@ #pragma once -#include <cmath> #include "point2d.hpp" #include "../base/matrix.hpp" +#include "../std/cmath.hpp" + namespace ang { template <typename T> struct Angle { - private: T m_val; T m_sin; T m_cos; + public: - Angle() : m_val(0), m_sin(0), m_cos(1) - {} - Angle(T const & val) : m_val(val), m_sin(::sin(val)), m_cos(::cos(val)) - {} - Angle(T const & sin, T const & cos) : m_val(::atan2(sin, cos)), m_sin(sin), m_cos(cos) - {} + Angle() : m_val(0), m_sin(0), m_cos(1) {} + Angle(T const & val) : m_val(val), m_sin(::sin(val)), m_cos(::cos(val)) {} + Angle(T const & sin, T const & cos) : m_val(::atan2(sin, cos)), m_sin(sin), m_cos(cos) {} T const & val() const { diff --git a/geometry/any_rect2d.hpp b/geometry/any_rect2d.hpp index 842e62b959..61e073445b 100644 --- a/geometry/any_rect2d.hpp +++ b/geometry/any_rect2d.hpp @@ -13,8 +13,6 @@ namespace m2 template <typename T> class AnyRect { - private: - ang::Angle<T> m_angle; Point<T> m_i; Point<T> m_j; @@ -36,15 +34,22 @@ namespace m2 } public: - - AnyRect() : m_i(1, 0), m_j(0, 1), m_zero(0, 0), m_rect(){} + AnyRect() : m_i(1, 0), m_j(0, 1), m_zero(0, 0), m_rect() {} /// creating from regular rect explicit AnyRect(Rect<T> const & r) - : m_angle(0), m_i(m_angle.cos(), m_angle.sin()), m_j(-m_angle.sin(), m_angle.cos()), - m_zero(r == Rect<T>() ? Point<T>(0, 0) : Point<T>(r.minX(), r.minY())), - m_rect(r == Rect<T>() ? Rect<T>() : Rect<T>(0, 0, r.SizeX(), r.SizeY())) - { + : m_angle(0), m_i(m_angle.cos(), m_angle.sin()), m_j(-m_angle.sin(), m_angle.cos()) + { + if (r.IsValid()) + { + m_zero = Point<T>(r.minX(), r.minY()); + m_rect = Rect<T>(0, 0, r.SizeX(), r.SizeY()); + } + else + { + m_zero = Point<T>(0, 0); + m_rect = r; + } } AnyRect(Point<T> const & zero, ang::Angle<T> const & angle, Rect<T> const & r) diff --git a/geometry/rect2d.hpp b/geometry/rect2d.hpp index 6f843f985e..6154eec94a 100644 --- a/geometry/rect2d.hpp +++ b/geometry/rect2d.hpp @@ -232,6 +232,7 @@ namespace m2 return true; } + /* bool operator < (m2::Rect<T> const & r) const { if (m_minX != r.m_minX) @@ -245,6 +246,7 @@ namespace m2 return false; } + */ bool operator == (m2::Rect<T> const & r) const { @@ -258,6 +260,20 @@ namespace m2 }; template <typename T> + inline bool IsEqual(Rect<T> const & r1, Rect<T> const & r2, double epsX, double epsY) + { + Rect<T> r = r1; + r.Inflate(epsX, epsY); + if (!r.IsRectInside(r2)) return false; + + r = r2; + r.Inflate(epsX, epsY); + if (!r.IsRectInside(r1)) return false; + + return true; + } + + template <typename T> inline m2::Rect<T> const Add(m2::Rect<T> const & r, m2::Point<T> const & p) { return m2::Rect<T>( |