snake.cpp 2.56 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 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 80 81 82 83 84 85 86 87
#include "snake.h"

namespace snake {

    bool Scenario::setArea(Area &area)
    {
        if (area.geoPolygon.size() < 3){
            error_str = "Area has less than three vertices.";
            return false;
        }
        if (area.type == MeasurementArea)
            return Scenario::_setMeasurementArea(area);
        else if (area.type == ServiceArea)
            return Scenario::_setServiceArea(area);
        else if (area.type == Corridor)
            return Scenario::_setCorridor(area);
        return false;
    }

    bool Scenario::_areas2enu()
    {
        if (_measurementArea.geoPolygon.size() > 0){
            _measurementAreaENU.clear();
            for(auto vertex : _measurementArea.geoPolygon) {
                    Point3D ENUVertex = toENU(_geoOrigin, vertex);
                    _measurementAreaENU.push_back(Point2D{ENUVertex[0], ENUVertex[1]});
            }
            _homePositionENU = polygonCenter(_measurementAreaENU);

            if (_serviceArea.geoPolygon.size() > 0){
                _serviceAreaENU.clear();
                for(auto vertex : _serviceArea.geoPolygon) {
                        Point3D ENUVertex = toENU(_geoOrigin, vertex);
                        _serviceAreaENU.push_back(Point2D{ENUVertex[0], ENUVertex[1]});
                }
            } else{
                error_str = "Service area has no vertices.";
                return false;
            }

            if (_corridor.geoPolygon.size() > 0){
                _corridorENU.clear();
                for(auto vertex : _corridor.geoPolygon) {
                        Point3D ENUVertex = toENU(_geoOrigin, vertex);
                        _corridorENU.push_back(Point2D{ENUVertex[0], ENUVertex[1]});
                }
            }

            return true;
        }

        error_str = "Measurement area has no vertices.";
        return false;
    }

    bool Scenario::_setMeasurementArea(Area &area)
    {
        if (area.geoPolygon.size() <= 0)
            return false;
        _geoOrigin = area.geoPolygon[0];
        _measurementArea = area;
        _measurementAreaENU.clear();
        _serviceAreaENU.clear();
        _corridorENU.clear();
        return true;

    }

    bool Scenario::_setServiceArea(Area &area)
    {
        if (area.geoPolygon.size() <= 0)
            return false;
        _serviceArea = area;
        _serviceAreaENU.clear();
        return true;
    }

    bool Scenario::_setCorridor(Area &area)
    {
        if (area.geoPolygon.size() <= 0)
            return false;
        _corridor = area;
        _corridorENU.clear();
        return true;
    }

}