Commit 68512dd5 authored by Valentin Platzgummer's avatar Valentin Platzgummer

planiCalc now namespace not class, about to add polygonCalc

parent 38ec24c5
...@@ -427,7 +427,8 @@ HEADERS += \ ...@@ -427,7 +427,8 @@ HEADERS += \
src/Wima/SphereCalculus.h \ src/Wima/SphereCalculus.h \
src/Wima/CircularSurveyComplexItem.h \ src/Wima/CircularSurveyComplexItem.h \
src/Wima/PlanimetryCalculus.h \ src/Wima/PlanimetryCalculus.h \
src/Wima/Circle.h src/Wima/Circle.h \
src/Wima/PolygonCalculus.h
SOURCES += \ SOURCES += \
src/api/QGCCorePlugin.cc \ src/api/QGCCorePlugin.cc \
src/api/QGCOptions.cc \ src/api/QGCOptions.cc \
...@@ -453,7 +454,8 @@ SOURCES += \ ...@@ -453,7 +454,8 @@ SOURCES += \
src/Wima/SphereCalculus.cc \ src/Wima/SphereCalculus.cc \
src/Wima/CircularSurveyComplexItem.cc \ src/Wima/CircularSurveyComplexItem.cc \
src/Wima/PlanimetryCalculus.cc \ src/Wima/PlanimetryCalculus.cc \
src/Wima/Circle.cc src/Wima/Circle.cc \
src/Wima/PolygonCalculus.cc
# #
# Unit Test specific configuration goes here (requires full debug build with all plugins) # Unit Test specific configuration goes here (requires full debug build with all plugins)
......
...@@ -97,16 +97,47 @@ QPolygonF Circle::approximate(int numberOfCorners) const ...@@ -97,16 +97,47 @@ QPolygonF Circle::approximate(int numberOfCorners) const
{ {
if ( numberOfCorners < 3) if ( numberOfCorners < 3)
return QPolygonF(); return QPolygonF();
return approximateSektor(numberOfCorners, 0, 2*M_PI);
}
QPolygonF Circle::approximate(double angleDiscretisation) const
{
return approximateSektor(angleDiscretisation, 0, 2*M_PI);
}
QPolygonF Circle::approximateSektor(int numberOfCorners, double alpha1, double alpha2) const
{
return approximateSektor((alpha2-alpha1)/double(numberOfCorners-1), alpha1, alpha2);
}
QPolygonF Circle::approximateSektor(double angleDiscretisation, double alpha1, double alpha2) const
{
// truncate alpha1 to [0, 2*pi], fmod() does not work in this case
alpha1 = PlanimetryCalculus::truncateAngle(alpha1);
alpha2 = PlanimetryCalculus::truncateAngle(alpha2);
double deltaAlpha = PlanimetryCalculus::truncateAngle(alpha2 - alpha1);
angleDiscretisation = PlanimetryCalculus::truncateAngle(angleDiscretisation);
if (angleDiscretisation > deltaAlpha || qFuzzyIsNull(angleDiscretisation))
return QPolygonF();
double rotationAngle = 2*M_PI/numberOfCorners;
QPolygonF polygon; QPolygonF polygon;
QPointF vertex(-_circleRadius,0); // initial vertex QPointF vertex(-_circleRadius,0); // initial vertex
polygon.append(vertex + _circleOrigin); double currentAngle = alpha1;
// rotate the vertex numberOfCorners-1 times add the origin and append to the polygon. // rotate the vertex numberOfCorners-1 times add the origin and append to the polygon.
for(int i = 0; i < numberOfCorners; i++) { while(currentAngle < alpha2) {
rotatePoint(vertex, rotationAngle); PlanimetryCalculus::rotatePoint(vertex, currentAngle);
polygon.append(vertex + _circleOrigin); polygon.append(vertex + _circleOrigin);
currentAngle = PlanimetryCalculus::truncateAngle(currentAngle + angleDiscretisation);
}
// append last point if necessarry
PlanimetryCalculus::rotatePoint(vertex, alpha2);
vertex = vertex + _circleOrigin;
if ( !qFuzzyIsNull(PlanimetryCalculus::distance(polygon.first(), vertex))
&& !qFuzzyIsNull(PlanimetryCalculus::distance(polygon.last(), vertex )) ){
polygon.append(vertex);
} }
return polygon; return polygon;
......
...@@ -4,9 +4,11 @@ ...@@ -4,9 +4,11 @@
#include <QPointF> #include <QPointF>
#include <QPolygonF> #include <QPolygonF>
#include <cmath>
#include "PlanimetryCalculus.h" #include "PlanimetryCalculus.h"
class Circle : public QObject, protected PlanimetryCalculus class Circle : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
...@@ -25,7 +27,10 @@ public: ...@@ -25,7 +27,10 @@ public:
QPointF origin() const; QPointF origin() const;
// Member methodes // Member methodes
QPolygonF approximate(int numberOfCorners) const; QPolygonF approximate (int numberOfCorners) const;
QPolygonF approximate (double angleDiscretisation) const;
QPolygonF approximateSektor(int numberOfCorners, double alpha1, double alpha2) const;
QPolygonF approximateSektor(double angleDiscretisation, double alpha1, double alpha2) const;
bool isNull() const; bool isNull() const;
signals: signals:
......
This diff is collapsed.
...@@ -5,11 +5,9 @@ ...@@ -5,11 +5,9 @@
#include <QtMath> #include <QtMath>
#include <QLineF> #include <QLineF>
#include "Circle.h" class Circle;
class PlanimetryCalculus
{ namespace PlanimetryCalculus {
public:
PlanimetryCalculus();
enum IntersectType{InsideNoIntersection, InsideTouching, InsideIntersection, enum IntersectType{InsideNoIntersection, InsideTouching, InsideIntersection,
OutsideIntersection, OutsideTouching, OutsideNoIntersection, OutsideIntersection, OutsideTouching, OutsideNoIntersection,
...@@ -31,8 +29,9 @@ public: ...@@ -31,8 +29,9 @@ public:
double distance(const QPointF &p1, const QPointF p2); double distance(const QPointF &p1, const QPointF p2);
double angle(const QPointF &p1, const QPointF p2); double angle(const QPointF &p1, const QPointF p2);
double angleDegree(const QPointF &p1, const QPointF p2); double angleDegree(const QPointF &p1, const QPointF p2);
double truncateAngle(double angle);
double truncateAngleDegree(double angle);
}
private:
IntersectType intersects(const Circle &circle, const QLineF &line, QList<QPointF> &intersectionPoints, bool calcIntersect);
};
#include "PolygonCalculus.h"
#ifndef POLYGONCALCULUS_H
#define POLYGONCALCULUS_H
namespace PolygonCalculus {
}
#endif // POLYGONCALCULUS_H
...@@ -668,23 +668,7 @@ void WimaArea::saveToJson(QJsonObject &json) ...@@ -668,23 +668,7 @@ void WimaArea::saveToJson(QJsonObject &json)
bool WimaArea::loadFromJson(const QJsonObject &json, QString& errorString) bool WimaArea::loadFromJson(const QJsonObject &json, QString& errorString)
{ {
if ( this->QGCMapPolygon::loadFromJson(json, false /*no poly required*/, errorString) ) { if ( this->QGCMapPolygon::loadFromJson(json, false /*no poly required*/, errorString) ) {
if ( json.contains(maxAltitudeName) && json[maxAltitudeName].i// Overrides from ComplexMissionItem if ( json.contains(maxAltitudeName) && json[maxAltitudeName].isDouble()) {
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
QString mapVisualQML (void) const final { return QStringLiteral("SurveyMapVisual.qml"); }
// Overrides from TransectStyleComplexItem
void save (QJsonArray& planItems) final;
bool specifiesCoordinate (void) const final { return true; }
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void applyNewAltitude (double newAltitude) final;
double timeBetweenShots (void) final;
// Overrides from VisualMissionionItem
QString commandDescription (void) const final { return tr("Survey"); }
QString commandName (void) const final { return tr("Survey"); }
QString abbreviation (void) const final { return tr("S"); }
bool readyForSave (void) const final;
double additionalTimeDelay (void) const final;sDouble()) {
_maxAltitude = json[maxAltitudeName].toDouble(); _maxAltitude = json[maxAltitudeName].toDouble();
return true; return true;
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment