#3934 Implement area threshold for contour polygons

This commit is contained in:
Gaute Lindkvist 2019-01-08 11:32:55 +01:00
parent c8f9505d1e
commit 7fccdf7153
3 changed files with 18 additions and 11 deletions

View File

@ -268,6 +268,8 @@ void RimContourMapProjection::generateContourPolygons()
{
std::vector<ContourPolygons> contourPolygons;
const double areaTreshold = 1.5 * m_sampleSpacing * m_sampleSpacing;
if (minValue() != std::numeric_limits<double>::infinity() &&
maxValue() != -std::numeric_limits<double>::infinity() &&
std::fabs(maxValue() - minValue()) > 1.0e-8)
@ -280,7 +282,7 @@ void RimContourMapProjection::generateContourPolygons()
if (nContourLevels > 2)
{
std::vector<caf::ContourLines::ClosedPolygons> closedContourLines =
caf::ContourLines::create(m_aggregatedVertexResults, xVertexPositions(), yVertexPositions(), contourLevels);
caf::ContourLines::create(m_aggregatedVertexResults, xVertexPositions(), yVertexPositions(), contourLevels, areaTreshold);
contourPolygons.resize(closedContourLines.size());
@ -300,7 +302,6 @@ void RimContourMapProjection::generateContourPolygons()
contourPolygons[i].push_back(contourPolygon);
}
}
smoothPolygonLoops(&contourPolygons[0]);
}
}

View File

@ -216,7 +216,8 @@ void caf::ContourLines::create(const std::vector<double>& dataXY, const std::vec
std::vector<caf::ContourLines::ClosedPolygons> caf::ContourLines::create(const std::vector<double>& dataXY,
const std::vector<double>& xPositions,
const std::vector<double>& yPositions,
const std::vector<double>& contourLevels)
const std::vector<double>& contourLevels,
double areaThreshold)
{
const double eps = 1.0e-4;
std::vector<std::vector<cvf::Vec2d>> contourLineSegments;
@ -291,6 +292,8 @@ std::vector<caf::ContourLines::ClosedPolygons> caf::ContourLines::create(const s
signedArea += (closedPolygonDeque[j + 1].x() - closedPolygonDeque[j].x()) *
(closedPolygonDeque[j + 1].y() + closedPolygonDeque[j].y());
}
if (std::abs(signedArea) > areaThreshold)
{
if (signedArea < 0.0)
{
closedPolygonsPerLevel[i].emplace_back(closedPolygonDeque.rbegin(), closedPolygonDeque.rend());
@ -299,7 +302,7 @@ std::vector<caf::ContourLines::ClosedPolygons> caf::ContourLines::create(const s
{
closedPolygonsPerLevel[i].emplace_back(closedPolygonDeque.begin(), closedPolygonDeque.end());
}
}
closedPolygonDeque.clear();
}
}

View File

@ -25,7 +25,9 @@
#include "cvfBase.h"
#include "cvfVector2.h"
#include <deque>
#include <limits>
#include <vector>
namespace caf
@ -39,7 +41,8 @@ public:
static std::vector<ClosedPolygons> create(const std::vector<double>& dataXY,
const std::vector<double>& xPositions,
const std::vector<double>& yPositions,
const std::vector<double>& contourLevels);
const std::vector<double>& contourLevels,
double areaTreshold = std::numeric_limits<double>::infinity());
private:
static void create(const std::vector<double>& dataXY,