///////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2017 Statoil ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at // for more details. // ///////////////////////////////////////////////////////////////////////////////// #pragma once #include "cvfVector3.h" #include "cvfBoundingBox.h" #include "cvfPlane.h" #include #include #include class RigCellGeometryTools { public: static double calculateCellVolume( const std::array& hexCorners ); static bool estimateHexOverlapWithBoundingBox( const std::array& hexCorners, const cvf::BoundingBox& boundingBox2dExtrusion, std::array* overlapCorners, cvf::BoundingBox* overlapBoundingBox ); static void createPolygonFromLineSegments( std::list>& intersectionLineSegments, std::vector>& polygons, double tolerance = 1.0e-4 ); static void simplifyPolygon( std::vector* vertices, double epsilon ); static void findCellLocalXYZ( const std::array& hexCorners, cvf::Vec3d& localXdirection, cvf::Vec3d& localYdirection, cvf::Vec3d& localZdirection ); static double polygonLengthInLocalXdirWeightedByArea( const std::vector& polygon2d ); static std::vector> intersectionWithPolygons( const std::vector& polygon1, const std::vector>& polygonToIntersectWith ); static std::vector> intersectionWithPolygon( const std::vector& polygon1, const std::vector& polygon2 ); static std::vector> subtractPolygons( const std::vector& sourcePolygon, const std::vector>& polygonsToSubtract ); static std::vector> subtractPolygon( const std::vector& sourcePolygon, const std::vector& polygonToSubtract ); enum ZInterpolationType { INTERPOLATE_LINE_Z, USE_HUGEVAL, USE_ZERO }; static std::vector> clipPolylineByPolygon( const std::vector& polyLine, const std::vector& polygon, ZInterpolationType interpolType = USE_ZERO ); static std::pair getLineThroughBoundingBox( const cvf::Vec3d& lineDirection, const cvf::BoundingBox& polygonBBox, const cvf::Vec3d& pointOnLine ); static double getLengthOfPolygonAlongLine( const std::pair& line, const std::vector& polygon ); static std::vector unionOfPolygons( const std::vector>& polygons ); static bool pointInsidePolygon2D( const cvf::Vec3d point, const std::vector& polygon ); private: static std::vector ajustPolygonToAvoidIntersectionsAtVertex( const std::vector& polyLine, const std::vector& polygon ); static double isLeftOfLine2D( const cvf::Vec3d& point1, const cvf::Vec3d& point2, const cvf::Vec3d& point3 ); };