#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; } }