Skip to content
SnakeWorker.h 3.2 KiB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#pragma once

#include <QObject>
#include <QVariant>
#include <QThread>
#include <QVector>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#include <QGeoCoordinate>
#include <vector>
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#include "GeoPolygonArray.h"
#include "PolygonArray.h"
Valentin Platzgummer's avatar
Valentin Platzgummer committed


typedef QList<QVariant> QVariantList;

typedef struct Result{
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    QVector<QGeoCoordinate> waypoints;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    GeoPolygonArray         tiles;
    PolygonArray            tilesLocal;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    QVariantList            tileCenterPoints;
    QGeoCoordinate          origin;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    QVector<unsigned long>  arrivalPathIdx;
    QVector<unsigned long>  returnPathIdx;
    bool                    success;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    QString                 errorMessage;
Valentin Platzgummer's avatar
Valentin Platzgummer committed

    void clear();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
}WorkerResult_t;

class SnakeWorker : public QThread{
    Q_OBJECT

public:
    SnakeWorker(QObject *parent = nullptr);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    template<template<class, class...> class Container>
    void setMeasurementArea     (const Container<QGeoCoordinate>  &measurementArea);
    template<template<class, class...> class Container>
    void setServiceArea         (const Container<QGeoCoordinate>  &serviceArea);
    template<template<class, class...> class Container>
    void setCorridor            (const Container<QGeoCoordinate>  &corridor);
    template<template<class, class...> class Container, class IntType>
    void setProgress            (const Container<IntType>  &progress);

    WorkerResult_t &result();

    double lineDistance() const;
    void setLineDistance(double lineDistance);

    double minTransectLength() const;
    void setMinTransectLength(double minTransectLength);

    double minTileArea() const;
    void setMinTileArea(double minTileArea);

    double tileHeight() const;
    void setTileHeight(double tileHeight);

    double tileWidth() const;
    void setTileWidth(double tileWidth);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
protected:
    void run() override;

private:
Valentin Platzgummer's avatar
Valentin Platzgummer committed
    bool precondition() const;


    std::vector<QGeoCoordinate> _mArea;
    std::vector<QGeoCoordinate> _sArea;
    std::vector<QGeoCoordinate> _corridor;
    std::vector<int>            _progress;
    double                      _lineDistance;
    double                      _minTransectLength;
    double                      _tileWidth;
    double                      _tileHeight;
    double                      _minTileArea;
    WorkerResult_t              _result;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
template<template<class, class...> class Container>
void SnakeWorker::setCorridor(const Container<QGeoCoordinate> &corridor)
{
    _corridor.clear();
    for (auto vertex : corridor) {
        _corridor.push_back(vertex);
    }
}

template<template<class, class...> class Container>
void SnakeWorker::setMeasurementArea(const Container<QGeoCoordinate> &measurementArea)
{
    _mArea.clear();
    for (auto vertex : measurementArea) {
        _mArea.push_back(vertex);
    }
}

template<template<class, class...> class Container>
void SnakeWorker::setServiceArea(const Container<QGeoCoordinate> &serviceArea)
{
    _sArea.clear();
    for (auto vertex : serviceArea) {
        _sArea.push_back(vertex);
    }
}

template<template<class, class...> class Container, class IntType>
void SnakeWorker::setProgress(const Container<IntType> &progress)
{
    _progress.clear();
    for (auto p : progress) {
        assert(p >= -1 && p <= 100);
        _progress.push_back(p);
    }
}