/** * @RDE_HEADER@ * $Id$ * $HeadURL$ * $Author$ */ #pragma once #include #include #include #include #include class QPointF; namespace LtsCoordTrans { struct UtmCoordinate; } namespace SituationMap { class ElevationMap; } namespace ParticipantManagement { namespace Interface { class Dtc; } } // namespace ParticipantManagement namespace NGL { class INGLLogger; } namespace AreaEffectSimulation { // N. Thoden, 18. jan 2024: // I can´t find a file like aes_types.h, aes_constants.h. // So i use polygons.h to provide following for service as well as gui: static const int s_maxTrajectoriesPerExplosionCluster = 900; namespace Polygons { using Trajectory = QPair>; struct AES_COMMON_EXPORT AreaBottomLeft { explicit AreaBottomLeft(const QPointF &cornerBottomLeftMeter, double widthMeter, double heightMeter, double rotation_deg); explicit AreaBottomLeft(const LtsCoordTrans::UtmCoordinate &cornerBottomLeftMeter, double widthMeter, double heightMeter, double rotation_deg); bool isValid() const; QPointF m_cornerBottomLeft; // meter double m_width{0}; // x; meter, double m_height{0}; // y; meter, aka length double m_rotation_deg{0}; }; AES_COMMON_EXPORT QPixmap pixmapFromPolygon(const QPolygonF &poly, const QColor &color, const int &width, const Qt::BrushStyle &fillPattern = Qt::BrushStyle::NoBrush, bool isLine = false, const QColor &bgcolor = Qt::transparent); AES_COMMON_EXPORT QPolygonF circle(const QPointF ¢er, qreal radius, int steps = 72); AES_COMMON_EXPORT QVector trajectory(const double &distance, const double &height, double angle, int steps = 72); AES_COMMON_EXPORT QPolygonF nContamination(const Database::AesNContamination &awf); AES_COMMON_EXPORT void bcCurrentCenterPoint(const Database::AesBCContamination &cwf, ProjectDataManagement::VolatilityType volatilityType, const QDateTime ¤tTime, QPointF &newCenterPointGeographic, double &distance); AES_COMMON_EXPORT QPolygonF bcContamination(const Database::AesBCContamination &cwf, ProjectDataManagement::VolatilityType volatilityType, double expansionFactor, const QDateTime ¤tTime); AES_COMMON_EXPORT QPolygonF airSupportImpact(const Database::AesAirSupportImpact &as, double chargeRadius); AES_COMMON_EXPORT QPolygonF explosionSingle(const Database::AesExplosionSingle &ef, double chargeRadius); AES_COMMON_EXPORT QPolygonF explosionArea(const Database::AesExplosionArea &ea); AES_COMMON_EXPORT QVector explosionAreaSingleExplosions(const Database::AesExplosionArea &explosionArea); // ExplosionCluster (3D-Wirksim) AES_COMMON_EXPORT AreaBottomLeft explosionClusterAddTla(const AreaBottomLeft &areaBottomLeftIn, int tla); AES_COMMON_EXPORT QPolygonF explosionClusterArea(const Database::AesExplosionCluster &explosionCluster); // geometryType-aware AES_COMMON_EXPORT QVector explosionClusterSingleExplosionsGAUSS(const Database::AesExplosionCluster &explosionCluster); AES_COMMON_EXPORT QVector explosionClusterSingleExplosionsGAUSS_Mtp(const Database::AesExplosionCluster &explosionCluster, double mtpRotationNorthDegree); AES_COMMON_EXPORT LtsUtils::QPoint3D calculateFiringUnitCenterNonRecursive(const std::shared_ptr &ppmDtc, int unitParticipantId, std::vector &singlePositionsOut, NGL::INGLLogger &logger); // MTP = Mittlerer TrefferPunkt AES_COMMON_EXPORT QVector explosionClusterAreaToMtps(const AreaBottomLeft &boundary, int numberOfMTPs, double *singleWidthOut = nullptr, double *singleHeightOut = nullptr); AES_COMMON_EXPORT QVector explosionClusterRadialToMtps(const AreaBottomLeft &boundary, int numberOfMTPs, const LtsCoordTrans::UtmCoordinate &firingPos, const LtsCoordTrans::UtmCoordinate &circleCenter, double *singleWidthOut = nullptr, double *singleHeightOut = nullptr); AES_COMMON_EXPORT QVector explosionClusterAreaToMtpsRelativeToBottomLeft(const AreaBottomLeft &boundary, int numberOfMTPs, double *singleWidthOut = nullptr, double *singleHeightOut = nullptr); AES_COMMON_EXPORT QVector explosionClusterRadialToMtpsRelativeToBottomLeft(const AreaBottomLeft &boundary, int numberOfMTPs, const LtsCoordTrans::UtmCoordinate &firingPos, const LtsCoordTrans::UtmCoordinate &circleCenter, double *singleWidthOut = nullptr, double *singleHeightOut = nullptr); AES_COMMON_EXPORT qint64 explosionClusterCalculatedFlightDuration2DMSec(const Database::AesExplosionCluster &explosionCluster, int timeOffsetMSec = 2000); AES_COMMON_EXPORT qint64 explosionClusterEstimatedMaxFlightDuration2DMSec(qint64 calculatedFlightDuration, int calculationOffsetMSec = 10000); // EffectCluster (3D-Wirksim/Adler) AES_COMMON_EXPORT QPolygonF effectClusterArea(const Database::AesEffectCluster &effectCluster); // geometryType-aware AES_COMMON_EXPORT QVector effectClusterSingleExplosionsGAUSS(const Database::AesEffectCluster &effectCluster); AES_COMMON_EXPORT QVector effectClusterSingleExplosionsGAUSS_Mtp(const Database::AesEffectCluster &effectCluster, const QHash &effectorData); // offRouteMine AES_COMMON_EXPORT QPolygonF offRouteMineArea(const Database::AesOffRouteMine &ea); AES_COMMON_EXPORT QPolygonF offRouteMineAreaImpact(const Database::AesOffRouteMine &ea, int steps = 72); AES_COMMON_EXPORT QPolygonF boobyTrapCake(const Database::AesBoobyTrap &boobyTrap, qreal radius); AES_COMMON_EXPORT QPointF bottomLeft2CenterPoint(QPointF bottomLeft, double width, double height, double rotation); AES_COMMON_EXPORT QPointF centerPoint2BottomLeft(QPointF centerPoint, double width, double height, double rotation); AES_COMMON_EXPORT QPolygonF functionalArea(const Database::AesFunctionalArea &fa); AES_COMMON_EXPORT QPolygonF technicalArea(const Database::AesTechnicalArea &ta); AES_COMMON_EXPORT QPolygonF reconArea(const Database::AesReconArea &ra); AES_COMMON_EXPORT QPolygonF dangerArea(const QVector &segments); AES_COMMON_EXPORT std::vector dangerAreaDefaultSegments(const QPointF ¢erPos, const int &radius); // AES_COMMON_EXPORT QPolygonF dangerArea(const shm_gefahrenbereich_rt& gb); AES_COMMON_EXPORT QPolygonF borderline(const QVector &segments); AES_COMMON_EXPORT QPolygonF gasPipe(const QVector &segments, double width); AES_COMMON_EXPORT QPolygonF gasPipeSegment(const Database::AesGasPipeSegment &start, const Database::AesGasPipeSegment &end, double width); AES_COMMON_EXPORT QPolygonF mineArea(const QVector &segments, double width, double density, bool bIsCenterLine); AES_COMMON_EXPORT QVector mineAreaSingleSegments(const QVector &segments, double width, bool bIsCenterLine); AES_COMMON_EXPORT QPolygonF mineAreaSegment(const Database::AesMineAreaSegment &segment, double width, bool bIsCenterLine); AES_COMMON_EXPORT QPolygonF mineCorridor(const QVector &segments, double width); AES_COMMON_EXPORT QVector mineCorridorSingleSegments(const QVector &segments, double width); AES_COMMON_EXPORT QPolygonF mineCorridorSegment(const Database::AesMineCorridorSegment &start, const Database::AesMineCorridorSegment &end, double width); // keep area (instead of width/density) as also random number is needed! AES_COMMON_EXPORT QVector minePositions(const Database::AesMineArea &area, const QVector &segments); AES_COMMON_EXPORT int getSequelNumber(const Database::AesExplosionArea &explosionArea); AES_COMMON_EXPORT int getSequelNumber(int startSequelNumber, int impactCount, qint64 originalEffectDurationMs, qint64 effectDurationMs); // calculates the minimum Area Enclosing Rectangle, bottom left is OUR Bottom Left, outangleDregrees is already counter clockwise AES_COMMON_EXPORT QRectF getMinAreaRect(const QVector &points, double &outAngleDegrees); // Hilfsfunktion für die konvexe Hülle (Monotone Chain Algorithmus) QVector calculateConvexHull(const QVector &points); AES_COMMON_EXPORT QVector geoVecToUtm(const std::vector &vecPos, int utmZone = -1); AES_COMMON_EXPORT QVector geoVecToUtmPointF(const std::vector &vecPos, int utmZone = -1); } // namespace Polygons } // namespace AreaEffectSimulation