snake.h 3.93 KB
Newer Older
1 2 3 4 5 6 7 8
#pragma once

#include <vector>
#include <string>
#include <array>

#include "snake_geometry.h"

Valentin Platzgummer's avatar
Valentin Platzgummer committed
9 10
#define clipper_scale 10000.0

11
using namespace std;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
12
using namespace snake_geometry;
13 14 15 16 17 18

namespace snake {

    enum AreaType {MeasurementArea, ServiceArea, Corridor};

    struct Area {
Valentin Platzgummer's avatar
Valentin Platzgummer committed
19
        GeoPoint2DList      geoPolygon;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
20 21 22
        double              altitude;
        size_t              layers;
        AreaType            type;
23 24
    };

Valentin Platzgummer's avatar
Valentin Platzgummer committed
25 26 27
    //========================================================================================
    // Scenario
    //========================================================================================
28 29 30 31
    class Scenario{
    public:
        Scenario();

Valentin Platzgummer's avatar
Valentin Platzgummer committed
32
        bool addArea(Area &area);
33

Valentin Platzgummer's avatar
Valentin Platzgummer committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47
        const Area &getMeasurementArea() const {return _measurementArea;}
        const Area &getServiceArea() const {return _serviceArea;}
        const Area &getCorridor() const {return _corridor;}

        const BoostPolygon &getMeasurementAreaENU() {return _measurementAreaENU;}
        const BoostPolygon &getServiceAreaENU()     {return _serviceAreaENU;}
        const BoostPolygon &getCorridorENU()        {return _corridorENU;}
        const BoostPolygon &getJoineAreaENU()       {return _joinedAreaENU;}
        const GeoPoint3D   &getOrigin()             {return _geoOrigin;}

        const vector<BoostPolygon> &getTilesENU()               {return _tilesENU;}
        const BoostPointList       &getTileCenterPointsENU()    {return _tileCenterPointsENU;}
        const min_bbox_rt          &getMeasurementAreaBBoxENU() {return _mAreaBoundingBox;}
        const BoostPoint           &getHomePositonENU()         {return _homePositionENU;}
48 49 50

        bool defined(double tileWidth, double tileHeight, double minTileArea);

Valentin Platzgummer's avatar
Valentin Platzgummer committed
51 52
        string errorString;

53 54 55 56 57 58
    private:
        bool _areas2enu();
        bool _setMeasurementArea(Area &area);
        bool _setServiceArea(Area &area);
        bool _setCorridor(Area &area);
        bool _calculateBoundingBox();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
59
        bool _calculateTiles(double tileWidth, double tileHeight, double minTileArea);
60 61 62 63 64 65
        bool _calculateJoinedArea();

        Area _measurementArea;
        Area _serviceArea;
        Area _corridor;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
66 67 68 69
        BoostPolygon _measurementAreaENU;
        BoostPolygon _serviceAreaENU;
        BoostPolygon _corridorENU;
        BoostPolygon _joinedAreaENU;
70

Valentin Platzgummer's avatar
Valentin Platzgummer committed
71 72
        min_bbox_rt _mAreaBoundingBox;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
73 74
        vector<BoostPolygon>    _tilesENU;
        BoostPointList          _tileCenterPointsENU;
75 76

        GeoPoint3D _geoOrigin;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
77 78 79 80 81 82 83 84 85 86
        BoostPoint _homePositionENU;
    };

    //========================================================================================
    // FlightPlan
    //========================================================================================
    class FlightPlan{
    public:
        FlightPlan();
        FlightPlan(const Scenario &scenario);
87

Valentin Platzgummer's avatar
Valentin Platzgummer committed
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
        void setScenario(const Scenario &scenario)          {_scenario = scenario;}
        void setProgress(const vector<int8_t> &progress)    {_progress = progress;}

        const Scenario          &getScenario(void)      {return _scenario;}
        const BoostPointList    &getWaypointsENU(void)  {return _waypointsENU;}
        const GeoPoint2DList    &getWaypoints(void)     {return _waypoints;}

        bool generate(double lineDistance, double minTransectLength);

        string errorString;

    private:
        bool _generateTransects(double lineDistance, double minTransectLength);
        bool _generateRoutingModel();
        Scenario                                _scenario;
        BoostPointList                          _waypointsENU;
        GeoPoint2DList                          _waypoints;
        vector<tuple<BoostPoint, BoostPoint>>   _transects;
        vector<int8_t>                          _progress;
        BoostPolygon                            _joinedAreaOffset;
108
    };
Valentin Platzgummer's avatar
Valentin Platzgummer committed
109 110 111 112

    namespace detail {
        double polygonOffset = 0.1; // meter, polygon offset to compenstate for numerical inaccurracies.
    }
113 114
}