Program Listing for File Polygon.hpp

Return to documentation for file (/tmp/ws/src/grid_map/grid_map_core/include/grid_map_core/Polygon.hpp)

/*
 * Polygon.hpp
 *
 *  Created on: Nov 7, 2014
 *      Author: Péter Fankhauser
 *   Institute: ETH Zurich, ANYbotics
 */

#ifndef GRID_MAP_CORE__POLYGON_HPP_
#define GRID_MAP_CORE__POLYGON_HPP_

// Eigen
#include <Eigen/Core>

#include <grid_map_core/TypeDefs.hpp>

// STD
#include <string>
#include <vector>

namespace grid_map
{

class Polygon
{
public:
  enum class TriangulationMethods
  {
    FAN  // Fan triangulation (only for convex polygons).
  };

  Polygon();

  explicit Polygon(std::vector<Position> vertices);

  virtual ~Polygon() = default;

  bool isInside(const Position & point) const;

  void addVertex(const Position & vertex);

  const Position & getVertex(const size_t index) const;

  void removeVertices();

  const Position & operator[](const size_t index) const;

  const std::vector<Position> & getVertices() const;

  size_t nVertices() const;

  void setTimestamp(const uint64_t timestamp);

  uint64_t getTimestamp() const;

  void resetTimestamp();

  void setFrameId(const std::string & frameId);

  const std::string & getFrameId() const;

  double getArea() const;

  Position getCentroid() const;

  void getBoundingBox(Position & center, Length & length) const;

  bool convertToInequalityConstraints(
    Eigen::MatrixXd & A,
    Eigen::VectorXd & b) const;

  bool offsetInward(const double margin);

  bool thickenLine(const double thickness);

  std::vector<Polygon> triangulate(
    const TriangulationMethods & method =
    TriangulationMethods::FAN) const;

  static Polygon fromCircle(
    const Position center, const double radius,
    const int nVertices = 20);

  static Polygon convexHullOfTwoCircles(
    const Position center1,
    const Position center2,
    const double radius,
    const int nVertices = 20);

  static Polygon convexHull(Polygon & polygon1, Polygon & polygon2);

  static Polygon monotoneChainConvexHullOfPoints(const std::vector<Position> & points);

protected:
  static bool sortVertices(
    const Eigen::Vector2d & vector1,
    const Eigen::Vector2d & vector2);

  static double computeCrossProduct2D(
    const Eigen::Vector2d & vector1,
    const Eigen::Vector2d & vector2);

  static double vectorsMakeClockwiseTurn(
    const Eigen::Vector2d & pointO,
    const Eigen::Vector2d & pointA,
    const Eigen::Vector2d & pointB);

  std::string frameId_;

  uint64_t timestamp_;

  std::vector<Position> vertices_;

public:
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};

}  // namespace grid_map
#endif  // GRID_MAP_CORE__POLYGON_HPP_