#include "WimaAreaData.h" WimaAreaData::WimaAreaData(QObject *parent) : QObject(parent) {} WimaAreaData::WimaAreaData(const WimaAreaData &other, QObject *parent) : QObject(parent), _path(other._path), _list(other._list), _center(other._center) {} WimaAreaData::WimaAreaData(const WimaArea &otherData, QObject *parent) : QObject(parent), _center(otherData.center()) { _setPathImpl(otherData.path()); } bool WimaAreaData::operator==(const WimaAreaData &data) const { return this->_path == data._path && this->_center == data._center; } bool WimaAreaData::operator!=(const WimaAreaData &data) const { return !this->operator==(data); } QVariantList WimaAreaData::path() const { return _path; } QGeoCoordinate WimaAreaData::center() const { return _center; } const QList &WimaAreaData::coordinateList() const { return _list; } bool WimaAreaData::containsCoordinate(const QGeoCoordinate &coordinate) const { using namespace PlanimetryCalculus; using namespace PolygonCalculus; using namespace GeoUtilities; if (this->coordinateList().size() > 2) { QPolygonF polygon; toCartesianList(this->coordinateList(), coordinate, polygon); return PlanimetryCalculus::contains(polygon, QPointF(0, 0)); } else return false; } void WimaAreaData::append(const QGeoCoordinate &c) { _list.append(c); _path.push_back(QVariant::fromValue(c)); emit pathChanged(); } void WimaAreaData::push_back(const QGeoCoordinate &c) { append(c); } void WimaAreaData::clear() { if (_list.size() > 0 || _path.size() > 0) { _list.clear(); _path.clear(); emit pathChanged(); } } void WimaAreaData::setPath(const QVariantList &coordinateList) { if (_path != coordinateList) { _setPathImpl(coordinateList); emit pathChanged(); } } void WimaAreaData::setCenter(const QGeoCoordinate ¢er) { if (_center != center) { _center = center; emit centerChanged(); } } WimaAreaData &WimaAreaData::operator=(const WimaAreaData &otherData) { setPath(otherData._list); setCenter(otherData._center); return *this; } WimaAreaData &WimaAreaData::operator=(const WimaArea &otherData) { setPath(otherData.path()); setCenter(otherData.center()); return *this; } void WimaAreaData::_setPathImpl(const QList &coordinateList) { _list = coordinateList; _path.clear(); // copy all coordinates to _path for (const auto &vertex : coordinateList) { _path.append(QVariant::fromValue(vertex)); } } void WimaAreaData::_setPathImpl(const QVariantList &coordinateList) { _path = coordinateList; _list.clear(); for (const auto &variant : coordinateList) { _list.push_back(variant.value()); } } /*! * \fn void WimaAreaData::setPath(const QList &coordinateList) * * Sets the path member to \a coordinateList by copying all entries of \a * coordinateList. Emits the \c pathChanged() signal. */ void WimaAreaData::setPath(const QList &coordinateList) { if (_list != coordinateList) { _setPathImpl(coordinateList); emit pathChanged(); } } bool operator==(const WimaAreaData &m1, const WimaArea &m2) { return m1.path() == m2.path() && m1.center() == m2.center(); } bool operator!=(const WimaAreaData &m1, const WimaArea &m2) { return !operator==(m1, m2); } bool operator==(const WimaArea &m1, const WimaAreaData &m2) { return m2 == m1; } bool operator!=(const WimaArea &m1, const WimaAreaData &m2) { return !operator==(m2, m1); } /*! * \class WimaArea::WimaAreaData * \brief Class to store and exchange data of a \c WimaArea Object. * Class to store and exchange data of a \c WimaArea Object. In contrast to \c * WimaArea this class does not uses the QGC Fact System. It is designed to * exchange data between the \c WimaPlaner and the \c WimaController class. And * it is the base class for any derived data objects * * \sa WimaArea */