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 += \
src/Wima/SphereCalculus.h \
src/Wima/CircularSurveyComplexItem.h \
src/Wima/PlanimetryCalculus.h \
src/Wima/Circle.h
src/Wima/Circle.h \
src/Wima/PolygonCalculus.h
SOURCES += \
src/api/QGCCorePlugin.cc \
src/api/QGCOptions.cc \
......@@ -453,7 +454,8 @@ SOURCES += \
src/Wima/SphereCalculus.cc \
src/Wima/CircularSurveyComplexItem.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)
......
......@@ -97,16 +97,47 @@ QPolygonF Circle::approximate(int numberOfCorners) const
{
if ( numberOfCorners < 3)
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;
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.
for(int i = 0; i < numberOfCorners; i++) {
rotatePoint(vertex, rotationAngle);
while(currentAngle < alpha2) {
PlanimetryCalculus::rotatePoint(vertex, currentAngle);
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;
......
......@@ -4,9 +4,11 @@
#include <QPointF>
#include <QPolygonF>
#include <cmath>
#include "PlanimetryCalculus.h"
class Circle : public QObject, protected PlanimetryCalculus
class Circle : public QObject
{
Q_OBJECT
public:
......@@ -25,7 +27,10 @@ public:
QPointF origin() const;
// 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;
signals:
......
This diff is collapsed.
......@@ -5,11 +5,9 @@
#include <QtMath>
#include <QLineF>
#include "Circle.h"
class PlanimetryCalculus
{
public:
PlanimetryCalculus();
class Circle;
namespace PlanimetryCalculus {
enum IntersectType{InsideNoIntersection, InsideTouching, InsideIntersection,
OutsideIntersection, OutsideTouching, OutsideNoIntersection,
......@@ -31,8 +29,9 @@ public:
double distance(const QPointF &p1, const QPointF p2);
double angle(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)
bool WimaArea::loadFromJson(const QJsonObject &json, QString& errorString)
{
if ( this->QGCMapPolygon::loadFromJson(json, false /*no poly required*/, errorString) ) {
if ( json.contains(maxAltitudeName) && json[maxAltitudeName].i// Overrides from ComplexMissionItem
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()) {
if ( json.contains(maxAltitudeName) && json[maxAltitudeName].isDouble()) {
_maxAltitude = json[maxAltitudeName].toDouble();
return true;
} 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