Program Listing for File point2d.hpp

Return to documentation for file (include/tuw_geometry/point2d.hpp)

#ifndef TUW_GEOMETRY__POINT2D_HPP
#define TUW_GEOMETRY__POINT2D_HPP

#include <memory>
#include <opencv2/core/core.hpp>
#include <tuw_geometry/utils.hpp>

namespace tuw
{

class Point2D;
class Polar2D;
using Point2DPtr = std::shared_ptr<Point2D>;
using Point2DConstPtr = std::shared_ptr<Point2D const>;

class Point2D : public cv::Vec<double, 3>
{
public:
  Point2D();
  Point2D(const cv::Point & p);
  Point2D(double x, double y);
  Point2D(double x, double y, double h);
  Point2D(const Polar2D & p);
  template<typename T>
  Point2D(const cv::Vec<T, 3> & p)
  : cv::Vec<double, 3>(p)
  {
  }
  template<typename T>
  Point2D(const cv::Vec<T, 2> & p)
  : cv::Vec<double, 3>(p)
  {
  }
  template<typename T>
  Point2D(const cv::Point_<T> & p)
  : cv::Vec<double, 3>(p.x, p.y, 1.)
  {
  }

  Point2D & set(const Point2D & p);

  Point2D & set(double x, double y);
  Point2D & set(double x, double y, double h);
  const double & x() const;
  double & x();
  const double & y() const;
  double & y();
  const double & h() const;
  double & h();
  void set_x(double v);
  double get_x() const;
  void set_y(double v);
  double get_y() const;
  void set_h(double v);
  double get_h() const;
  double angle() const;
  double radius() const;
  cv::Vec<double, 2> vector() const;
  double distanceTo(const Point2D & p) const;
  const cv::Point_<double> & cv() const;
  cv::Point_<double> & cv();
  bool inside(double x0, double y0, double x1, double y1) const;
  friend std::ostream & operator<<(std::ostream & os, const Point2D & o)
  {
    os << "[" << o.x() << ", " << o.y() << "]";
    return os;
  }
  std::string str(const char * format = "[%6.4lf, %6.4lf, %6.5lf]") const;

  bool equal(const Point2D & o, double tolerance = 0.0001) const;
};
using Points2D = std::vector<Point2D>;
using Points2DPtr = std::shared_ptr<Points2D>;
using Points2DConstPtr = std::shared_ptr<Points2D const>;
}  // namespace tuw

namespace cv
{
template<typename _Tp>
static inline tuw::Point2D operator*(const Matx<_Tp, 3, 3> & a, const tuw::Point2D & b)
{
  Matx<_Tp, 3, 1> c(a, b, Matx_MatMulOp());
  return reinterpret_cast<const tuw::Point2D &>(c);
}
}  // namespace cv
#endif  //TUW_GEOMETRY__POINT2D_HPP