SnakeWorker.cc 5.02 KB
Newer Older
1
#include "SnakeWorker.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed
2 3 4
#include <QGeoCoordinate>


Valentin Platzgummer's avatar
Valentin Platzgummer committed
5 6 7 8 9 10 11 12
#include "snake_geometry.h"
#include "snake.h"



using namespace snake;
using namespace snake_geometry;

Valentin Platzgummer's avatar
Valentin Platzgummer committed
13
SnakeWorker::SnakeWorker(QObject *parent) : QThread(parent)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
14 15 16 17 18
    , _lineDistance(3)
    , _minTransectLength(2)
    , _tileWidth(5)
    , _tileHeight(5)
    , _minTileArea(3)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
19
{
20
}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
21

22 23
SnakeWorker::~SnakeWorker()
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
24 25 26

}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
27
WorkerResult_t &SnakeWorker::result()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
28
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
29
    return _result;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
30 31
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
32
bool SnakeWorker::precondition() const
Valentin Platzgummer's avatar
Valentin Platzgummer committed
33 34
{

Valentin Platzgummer's avatar
Valentin Platzgummer committed
35 36 37 38
    return _mArea.size() > 0
            && _sArea.size() > 0
            && _corridor.size() > 0
            && _progress.size() > 0;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
39 40
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
41
double SnakeWorker::lineDistance() const
42
{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
43
    return _lineDistance;
44 45
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
46 47
void SnakeWorker::run()
{
48
    // Reset _result struct.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
    _result.clear();

    if ( !precondition())
        return;

    Scenario scenario;// Initialize scenario.

    Area mArea;
    for (auto vertex : _mArea){
        mArea.geoPolygon.push_back(GeoPoint2D{vertex.latitude(), vertex.longitude()});
    }
    mArea.type = AreaType::MeasurementArea;

    Area sArea;
    for (auto vertex : _sArea){
        sArea.geoPolygon.push_back(GeoPoint2D{vertex.latitude(), vertex.longitude()});
    }
    sArea.type = AreaType::ServiceArea;

    Area corridor;
    for (auto vertex : _corridor){
        corridor.geoPolygon.push_back(GeoPoint2D{vertex.latitude(), vertex.longitude()});
    }
    corridor.type = AreaType::Corridor;

    scenario.addArea(mArea);
    scenario.addArea(sArea);
    scenario.addArea(corridor);

    if ( !scenario.update(_tileWidth, _tileHeight, _minTileArea) )
        return;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
80 81

    FlightPlan flightplan;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
82
    flightplan.setScenario(scenario);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
83 84 85 86 87 88
    flightplan.setProgress(_progress);

    // Trying to generate flight plan.
    if ( !flightplan.generate(_lineDistance, _minTransectLength) ){
        // error
        for (auto c : flightplan.errorString){
89
            _result.errorMessage.push_back(QChar(c));
Valentin Platzgummer's avatar
Valentin Platzgummer committed
90 91 92
        }
    } else {
        //success!!!
93
        _result.success = true;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
94 95

        // Fill result struct.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
96
        auto& waypoints = flightplan.getWaypoints();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
97
        for (auto vertex : waypoints){
Valentin Platzgummer's avatar
Valentin Platzgummer committed
98
            _result.waypoints.append(QGeoCoordinate(vertex[0], vertex[1], 0));
Valentin Platzgummer's avatar
Valentin Platzgummer committed
99 100
        }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
101
        auto& arrivalPathIdx = flightplan.getArrivalPathIdx();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
102
        for (auto idx : arrivalPathIdx){
103
            _result.arrivalPathIdx.append(idx);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
104 105
        }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
106
        auto& returnPathIdx = flightplan.getReturnPathIdx();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
107
        for (auto idx : returnPathIdx){
108
            _result.returnPathIdx.append(idx);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
109 110
        }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

        // Get tiles and origin.
        auto origin = scenario.getOrigin();
        _result.origin.setLatitude(origin[0]);
        _result.origin.setLongitude(origin[1]);
        _result.origin.setAltitude(origin[2]);
        const auto &tiles = scenario.getTiles();
        const auto &cps = scenario.getTileCenterPoints();
        for ( unsigned int i=0; i < tiles.size(); ++i ) {
            const auto &tile = tiles[i];
            SnakeTile Tile;
            for ( const auto &vertex : tile) {
                QGeoCoordinate QVertex(vertex[0], vertex[1], vertex[2]);
                Tile.append(QVertex);
            }
            const auto &centerPoint = cps[i];
            QGeoCoordinate QCenterPoint(centerPoint[0], centerPoint[1], centerPoint[2]);
            Tile.setCenter(QCenterPoint);
            _result.tiles.polygons().append(Tile);
            _result.tileCenterPoints.append(QVariant::fromValue(QCenterPoint));
         }

        // Get local tiles.
        const auto &tilesENU = scenario.getTilesENU();
        for ( unsigned int i=0; i < tilesENU.size(); ++i ) {
            const auto &tile = tilesENU[i];
            Polygon2D Tile;
            for ( const auto &vertex : tile.outer()) {
                QPointF QVertex(vertex.get<0>(), vertex.get<1>());
                Tile.path().append(QVertex);
            }
            _result.tilesLocal.polygons().append(Tile);
        }

Valentin Platzgummer's avatar
Valentin Platzgummer committed
145 146
    }
}
Valentin Platzgummer's avatar
Valentin Platzgummer committed
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208

double SnakeWorker::minTransectLength() const
{
    return _minTransectLength;
}

void SnakeWorker::setMinTransectLength(double minTransectLength)
{
    if (minTransectLength > 0)
        _minTransectLength = minTransectLength;
}

double SnakeWorker::minTileArea() const
{
    return _minTileArea;
}

void SnakeWorker::setLineDistance(double lineDistance)
{
    if (lineDistance > 0)
        _lineDistance = lineDistance;
}

double SnakeWorker::tileWidth() const
{
    return _tileWidth;
}

void SnakeWorker::setTileWidth(double tileWidth)
{
    if (tileWidth > 0)
        _tileWidth = tileWidth;
}

double SnakeWorker::tileHeight() const
{
    return _tileHeight;
}

void SnakeWorker::setTileHeight(double tileHeight)
{
    if (tileHeight > 0)
        _tileHeight = tileHeight;
}

void SnakeWorker::setMinTileArea(double minTileArea)
{
    if (minTileArea > 0)
        _minTileArea = minTileArea;
}

void Result::clear()
{
    this->success = false;
    this->errorMessage = "";
    this->waypoints.clear();
    this->returnPathIdx.clear();
    this->arrivalPathIdx.clear();
    this->tiles.polygons().clear();
    this->tilesLocal.polygons().clear();
    this->tileCenterPoints.clear();
}