/** * @RDE_HEADER@ * Unittest * $Id$ * $HeadURL$ * $Author$ */ #include "polygons_unit_test.h" #include #include #include #include #include // #include #include #include 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 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 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 &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 &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 &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); }