Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

@@ -0,0 +1,308 @@
/**
* @RDE_HEADER@
* Unittest
* $Id$
* $HeadURL$
* $Author$
*/
#include "polygons_unit_test.h"
#include <Services/AreaEffectSimulation/Utils/polygons.h>
#include <nglapplication/nglcoreapplication.h>
#include <LtsCoordTrans/lts_coord_trans.h>
#include <QTransform>
#include <QTextStream> //
#include <QtTest/QTest>
#include <QDebug>
#include <iostream>
using namespace AreaEffectSimulation;
double distanceMeter(const LtsCoordTrans::UtmCoordinate utmCoord1, const LtsCoordTrans::UtmCoordinate &utmCoord2)
{
double dist = LtsCoordTrans::distance(utmCoord1, utmCoord2);
qCritical() << " dist" << dist;
return dist;
}
double distanceMeter(const QPointF &geoCoord1, const LtsCoordTrans::UtmCoordinate &utmCoord2)
{
const LtsCoordTrans::UtmCoordinate &utmCoord1 = LtsCoordTrans::UtmCoordinate::fromGeographic(geoCoord1);
double dist = LtsCoordTrans::distance(utmCoord1, utmCoord2);
qCritical() << " dist" << dist;
return dist;
}
void UnitTestPolygons::test_QTrans()
{
QPolygonF poly;
poly.reserve(3);
poly.append(QPointF(0, 0));
poly.append(QPointF(1, 0));
poly.append(QPointF(2, 0));
//rotate
{
QTransform trans;
trans.rotate(90);
QPolygonF poly2a = trans.map(poly);
qCritical() << "poly2a = " << poly2a;
QVERIFY2(poly2a.first() == QPointF(0, 0), "QTransform failed");
QVERIFY2(poly2a.last() == QPointF(0, 2), "QTransform failed; vec.last()");
}
{
QPolygonF poly2b = QTransform().rotate(90).map(poly); // squence in a single line
qCritical() << "poly2b = " << poly2b;
QVERIFY2(poly2b.first() == QPointF(0, 0), "QTransform failed");
QVERIFY2(poly2b.last() == QPointF(0, 2), "QTransform failed; vec.last()");
}
}
void printAbl(const Polygons::AreaBottomLeft &obj)
{
qCritical() << " AreaBottomLeft = "
<< ", cornerBL=" << obj.m_cornerBottomLeft
<< ", m_width=" << obj.m_width
<< ", m_height=" << obj.m_height
<< ", m_height=" << obj.m_height;
}
void UnitTestPolygons::test_explosionClusterAddTla()
{
double width = 1000; // x
double height = 100; // y
double rotation_deg = 0;
const Polygons::AreaBottomLeft boundaryOrg(QPointF(123, 123), width, height, rotation_deg);
printAbl(boundaryOrg);
{
int zog = 0;
const Polygons::AreaBottomLeft areaBlWithZog = Polygons::explosionClusterAddTla(boundaryOrg, zog);
printAbl(areaBlWithZog);
QVERIFY2(areaBlWithZog.m_cornerBottomLeft == boundaryOrg.m_cornerBottomLeft, "m_cornerBottomLeft failed");
QVERIFY2(areaBlWithZog.m_width == boundaryOrg.m_width, "m_width failed");
QVERIFY2(areaBlWithZog.m_height == boundaryOrg.m_height, "m_height failed");
QVERIFY2(areaBlWithZog.m_rotation_deg == boundaryOrg.m_rotation_deg, "m_rotation_deg failed");
}
{
int zog = 10;
const Polygons::AreaBottomLeft areaBlWithZog = Polygons::explosionClusterAddTla(boundaryOrg, zog);
printAbl(areaBlWithZog);
QVERIFY2(areaBlWithZog.m_cornerBottomLeft == QPointF(113, 113), "m_cornerBottomLeft failed");
QVERIFY2(areaBlWithZog.m_width == boundaryOrg.m_width+(2*zog), "m_width failed");
QVERIFY2(areaBlWithZog.m_height == boundaryOrg.m_height+(2*zog), "m_height failed");
QVERIFY2(areaBlWithZog.m_rotation_deg == boundaryOrg.m_rotation_deg, "m_rotation_deg failed");
}
{
double rotation_deg = 30;
const Polygons::AreaBottomLeft boundaryOrgRot(QPointF(123, 123), width, height, rotation_deg);
int zog = 10;
const Polygons::AreaBottomLeft areaBlWithZog = Polygons::explosionClusterAddTla(boundaryOrgRot, zog);
printAbl(areaBlWithZog);
QVERIFY2((areaBlWithZog.m_cornerBottomLeft - QPointF(109.34, 119.34)).manhattanLength() < 1, "m_cornerBottomLeft failed");
QVERIFY2(areaBlWithZog.m_width == boundaryOrgRot.m_width+(2*zog), "m_width failed");
QVERIFY2(areaBlWithZog.m_height == boundaryOrgRot.m_height+(2*zog), "m_height failed");
QVERIFY2(areaBlWithZog.m_rotation_deg == boundaryOrgRot.m_rotation_deg, "m_rotation_deg failed");
}
}
void UnitTestPolygons::test_explosionClusterAreaToMtpsRelativeToBottomLeft_noRotation()
{
double width = 1000; // x
double height = 100; // y
double rotation_deg = 0;
const Polygons::AreaBottomLeft boundary(QPointF(123, 123), width, height, rotation_deg);
const int numberOfMTPs = 4;
double singleWidthOut = 0;
double singleHeightOut = 0;
QVector<QPointF> vec = Polygons::explosionClusterAreaToMtpsRelativeToBottomLeft(boundary, numberOfMTPs, &singleWidthOut, &singleHeightOut);
qCritical() << "vec = " << vec;
qCritical() << "singleWidthOut = " << singleWidthOut;
qCritical() << "singleHeightOut = " << singleHeightOut;
// independent on rotation
QVERIFY2(vec.size() == numberOfMTPs, "noRotation failed; numberOfMTPs");
QVERIFY2(singleWidthOut == width/4, "noRotation failed; singleWidthOut");
QVERIFY2(singleHeightOut == height, "noRotation failed; singleHeightOut");
// depending on rotation
QVERIFY2(vec.first() == QPointF(125.0, 50), "noRotation failed");
QVERIFY2(vec[1] == QPointF(375.0, 50), "noRotation failed");
QVERIFY2(vec[2] == QPointF(625.0, 50), "noRotation failed");
QVERIFY2(vec.last() == QPointF(875.0, 50), "noRotation failed");
}
void UnitTestPolygons::test_explosionClusterAreaToMtpsRelativeToBottomLeft_withRotation()
{
double width = 1000; // x
double height = 100; // y
double rotation_deg = -90;
const Polygons::AreaBottomLeft boundary(QPointF(123, 123), width, height, rotation_deg);
const int numberOfMTPs = 4;
double singleWidthOut = 0;
double singleHeightOut = 0;
QVector<QPointF> vec = Polygons::explosionClusterAreaToMtpsRelativeToBottomLeft(boundary, numberOfMTPs, &singleWidthOut, &singleHeightOut);
qCritical() << "vec = " << vec;
qCritical() << "singleWidthOut = " << singleWidthOut;
qCritical() << "singleHeightOut = " << singleHeightOut;
// independent on rotation
QVERIFY2(vec.size() == numberOfMTPs, "withRotation failed; numberOfMTPs");
QVERIFY2(singleWidthOut == width/4, "withRotation failed; singleWidthOut");
QVERIFY2(singleHeightOut == height, "withRotation failed; singleHeightOut");
// depending on rotation
QVERIFY2(vec.first() == QPointF(-50, 125), "withRotation failed");
QVERIFY2(vec[1] == QPointF(-50, 375), "withRotation failed");
QVERIFY2(vec[2] == QPointF(-50, 625), "withRotation failed");
QVERIFY2(vec.last() == QPointF(-50, 875), "withRotation failed");
}
void UnitTestPolygons::test_explosionClusterSingleExplosionsGAUSS_Mtp()
{
Database::AesExplosionCluster explosionClusterDb;
double width = 1000; // x
double height = 100; // y
double rotation_deg = 0;
LtsCoordTrans::UtmCoordinate UTM = LtsCoordTrans::UtmCoordinate::fromMgrs(QLatin1String("32UMD100000100000")); // 32U MD 100000 100000
const Polygons::AreaBottomLeft boundary(UTM.geographic(), width, height, rotation_deg);
explosionClusterDb.id = 1;
explosionClusterDb.impactPosition = boundary.m_cornerBottomLeft;
explosionClusterDb.impactLength = boundary.m_height;
explosionClusterDb.impactWidth = boundary.m_width;
explosionClusterDb.rotationAngle = boundary.m_rotation_deg;
explosionClusterDb.zog = 0;
explosionClusterDb.impactCount = 8;
explosionClusterDb.mhpCountRequest = 4;
// rotation = 0
{
double mtpRotationNorthDegree = explosionClusterDb.rotationAngle;
const QVector<QPointF> &singleExplosions = Polygons::explosionClusterSingleExplosionsGAUSS_Mtp(explosionClusterDb, mtpRotationNorthDegree);
qCritical() << "rotation_deg = " << rotation_deg
<< ", mtpRotationNorthDegree = " << mtpRotationNorthDegree
<< ", explosionClusterDb = " << singleExplosions;
for (const auto &singleExplosion : qAsConst(singleExplosions))
qDebug() << "singleExUtm: " << LtsCoordTrans::UtmCoordinate::fromGeographic(singleExplosion).mgrs();
size_t i = 0;
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10029 10048"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10298 10042"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10682 10046"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10908 10055"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10101 10076"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10386 10022"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10581 10032"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10828 10065"))) < 1, "ERROR, distanceMeter failed!!");
}
// rotation = -90
rotation_deg = -90;
const Polygons::AreaBottomLeft boundary2(UTM.geographic(), width, height, rotation_deg);
explosionClusterDb.id = 1;
explosionClusterDb.impactPosition = boundary2.m_cornerBottomLeft;
explosionClusterDb.impactLength = boundary2.m_height;
explosionClusterDb.impactWidth = boundary2.m_width;
explosionClusterDb.rotationAngle = boundary2.m_rotation_deg;
{
double mtpRotationNorthDegree = explosionClusterDb.rotationAngle;
const QVector<QPointF> &singleExplosions = Polygons::explosionClusterSingleExplosionsGAUSS_Mtp(explosionClusterDb, mtpRotationNorthDegree);
qCritical() << "rotation_deg = " << rotation_deg
<< ", mtpRotationNorthDegree = " << mtpRotationNorthDegree
<< " explosionClusterDb = " << singleExplosions;
for (const auto &singleExplosion : qAsConst(singleExplosions))
qCritical() << "singleExUtm: " << LtsCoordTrans::UtmCoordinate::fromGeographic(singleExplosion).mgrs();
size_t i = 0;
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09952 10029"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09958 10298"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09954 10682"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09945 10908"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09924 10101"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09978 10386"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09968 10581"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09935 10828"))) < 1, "ERROR, distanceMeter failed!!");
}
// rotation = -45
rotation_deg = -45;
int zog = 100;
const Polygons::AreaBottomLeft boundary3(UTM.geographic(), width, height, rotation_deg);
explosionClusterDb.id = 1;
explosionClusterDb.impactPosition = boundary3.m_cornerBottomLeft;
explosionClusterDb.impactLength = boundary3.m_height;
explosionClusterDb.impactWidth = boundary3.m_width;
explosionClusterDb.rotationAngle = boundary3.m_rotation_deg;
explosionClusterDb.zog = zog;
{
double mtpRotationNorthDegree = explosionClusterDb.rotationAngle;
const QVector<QPointF> &singleExplosions = Polygons::explosionClusterSingleExplosionsGAUSS_Mtp(explosionClusterDb, mtpRotationNorthDegree);
qCritical() << "rotation_deg = " << rotation_deg
<< ", zog = " << zog
<< ", mtpRotationNorthDegree = " << mtpRotationNorthDegree
<< " explosionClusterDb = " << singleExplosions;
for (const auto &singleExplosion : qAsConst(singleExplosions))
qCritical() << "singleExUtm: " << LtsCoordTrans::UtmCoordinate::fromGeographic(singleExplosion).mgrs();
size_t i = 0;
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09923 09984"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10164 10200"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10480 10536"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10654 10746"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 09925 10104"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10281 10233"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10426 10419"))) < 1, "ERROR, distanceMeter failed!!");
QVERIFY2(distanceMeter(singleExplosions[i++], LtsCoordTrans::UtmCoordinate::fromMgrs(QStringLiteral("32U MD 10565 10699"))) < 1, "ERROR, distanceMeter failed!!");
}
}
int main(int argc, char *argv[])
{
NGLCoreApplication app(argc, argv);
app.createLogger("UnitTest_TNE-ALOG", "log4cxxUnitTest.props");
UnitTestPolygons tc;
return QTest::qExec(&tc, argc, argv);
}