Program Listing for File Path.h

Return to documentation for file (include/fields2cover/types/Path.h)

//=============================================================================
//    Copyright (C) 2021-2024 Wageningen University - All Rights Reserved
//                     Author: Gonzalo Mier
//                        BSD-3 License
//=============================================================================

#pragma once
#ifndef FIELDS2COVER_TYPES_PATH_H_
#define FIELDS2COVER_TYPES_PATH_H_

#include <gdal/ogr_geometry.h>
#include <fstream>
#include <vector>
#include <string>
#include "fields2cover/types/Swath.h"
#include "fields2cover/types/Point.h"
#include "fields2cover/types/LineString.h"
#include "fields2cover/types/MultiLineString.h"
#include "fields2cover/types/PathState.h"

namespace f2c::types {

struct Path {
 public:
  PathState& getState(size_t i);
  const PathState& getState(size_t i) const;
  void setState(size_t i, const PathState& ps);

  void addState(const PathState& ps);
  void addState(const Point& p, double ang, double len,
      PathDirection dir = PathDirection::FORWARD,
      PathSectionType type = PathSectionType::SWATH, double vel = 1.0);

  std::vector<PathState>& getStates();
  const std::vector<PathState>& getStates() const;
  void setStates(const std::vector<PathState>& v_ps);

  double getTaskTime() const;

  std::vector<PathState>::const_iterator cbegin() const;
  std::vector<PathState>::const_iterator cend() const;
  std::vector<PathState>::const_iterator begin() const;
  std::vector<PathState>::const_iterator end() const;
  std::vector<PathState>::iterator begin();
  std::vector<PathState>::iterator end();

  const PathState& operator[](size_t idx) const;
  PathState& operator[](size_t idx);
  const PathState& back() const;
  PathState& back();


  Path& operator+=(const Path& path);
  size_t size() const;

  double getDimMinX() const;
  double getDimMinY() const;
  double getDimMaxX() const;
  double getDimMaxY() const;

  void moveTo(const Point&);
  void rotateFromPoint(const Point&, double ang);

  void mirrorX();
  void mirrorY();
  void setBackwardDir();
  void setBackwardDir(int i);
  void setForwardDir();
  void setForwardDir(int i);
  void setSwathType();
  void setSwathType(int i);
  void setTurnType();
  void setTurnType(int i);

  double length(void) const;

  void appendSwath(const Swath& swath, double cruise_speed);

  PathState at(double t) const;
  Point atStart() const;
  Point atEnd() const;

  LineString toLineString() const;
  std::string serializePath(size_t digit_precision = 6) const;
  void saveToFile(const std::string& file, size_t precision = 6) const;
  void loadFile(const std::string& file);

  Path discretizeSwath(double step_size) const;
  Path& discretize(double step_size);
  Path& populate(int number_points = 100);
  Path& reduce(double min_dist_equal = 0.1);

 private:
  std::vector<PathState> states_;
};

}  // namespace f2c::types

#endif  //  FIELDS2COVER_TYPES_PATH_H_