/** * @RDE_HEADER@ * Test ob sich ein Rechteck mit Wirkfeldformen überschneidet * $Id$ * $HeadURL$ * $Author$ */ #include "intersections.h" #include "polygons.h" #include #include namespace AreaEffectSimulation { namespace Intersections { static inline bool intersects(const QPolygonF &p1, const QPolygonF &p2) { QPainterPath pp1; pp1.addPolygon(p1); QPainterPath pp2; pp2.addPolygon(p2); return pp1.intersects(pp2); } bool nContamination(const Database::AesNContamination &awf, const QPolygonF &poly) { return (intersects(Polygons::nContamination(awf), poly)); } bool bcContamination(const Database::AesBCContamination &cwf, ProjectDataManagement::VolatilityType volatilityType, double expansionFactor, const QDateTime ¤tTime, const QPolygonF &poly) { return (intersects(Polygons::bcContamination(cwf, volatilityType, expansionFactor, currentTime), poly)); } bool explosionSingle(const Database::AesExplosionSingle &es, double chargeRadius, const QPolygonF &poly) { return (intersects(Polygons::explosionSingle(es, chargeRadius), poly)); } bool explosionArea(const Database::AesExplosionArea &ea, const QPolygonF &poly) { return (intersects(Polygons::explosionArea(ea), poly)); } bool mineArea(const QVector &segments, double width, double density, bool bIsCenterLine, const QPolygonF &poly) { // if(!area.boundingRect.isEmpty() && !area.boundingRect.intersects(rect)) // return false; return (intersects(Polygons::mineArea(segments, width, density, bIsCenterLine), poly)); } QVector mineIdsInCorridor(const Database::AesMineArea &area, const QVector &segments, const QVector &corridorSegments) { QVector minesIds; const QVector singleMines = Polygons::minePositions(area, segments); // Other possibility: Create total polygon by uniting corridor segments. But that may be less efficient. for (const QPolygonF &corridorSegment : corridorSegments) { for (int i = 0; i < singleMines.size(); ++i) { if (corridorSegment.contains(singleMines[i])) minesIds << i; } } return minesIds; } } // Namespace }