EMODnet Quantized Mesh Generator for Cesium
tin_creation_remeshing_strategy.h
1 // Copyright (c) 2018 Coronis Computing S.L. (Spain)
2 // All rights reserved.
3 //
4 // This file is part of EMODnet Quantized Mesh Generator for Cesium.
5 //
6 // This program is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program. If not, see <https://www.gnu.org/licenses/>.
18 //
19 // Author: Ricard Campos (ricardcd@gmail.com)
20 
21 #ifndef EMODNET_QMGC_TIN_CREATION_REMESHING_H
22 #define EMODNET_QMGC_TIN_CREATION_REMESHING_H
23 
24 #include "tin_creator.h"
25 #include "tin_creation_utils.h"
26 
27 namespace TinCreation {
28 
47 {
48 public:
49  TinCreationRemeshingStrategy( double facetDistance,
50  double facetAngle,
51  double facetSize,
52  double edgeSize)
53  : m_facetAngle(facetAngle)
54  {
55  m_facetDistancePerZoom = std::vector<double>{facetDistance};
56  m_facetSizePerZoom = std::vector<double>{facetSize};
57  m_edgeSizePerZoom = std::vector<double>{edgeSize};
59  }
60 
61  TinCreationRemeshingStrategy(const std::vector<double>& facetDistance,
62  double facetAngle,
63  const std::vector<double>& facetSize,
64  const std::vector<double>& edgeSize)
65  : m_facetDistancePerZoom(facetDistance)
66  , m_facetAngle(facetAngle)
67  , m_facetSizePerZoom(facetSize)
68  , m_edgeSizePerZoom(edgeSize)
69  {
71  }
72 
73  Polyhedron create(const std::vector<Point_3>& dataPts,
74  const bool& constrainEasternVertices,
75  const bool& constrainWesternVertices,
76  const bool& constrainNorthernVertices,
77  const bool& constrainSouthernVertices);
78 
79  // WARNING: The remeshing strategy should not be used for tiled rendering!
80  void setParamsForZoom(const unsigned int& zoom) {
81  m_facetDistance = standardHandlingOfThresholdPerZoom(m_facetDistancePerZoom, zoom);
82  m_facetSize = standardHandlingOfThresholdPerZoom(m_facetSizePerZoom, zoom);
83  m_edgeSize = standardHandlingOfThresholdPerZoom(m_edgeSizePerZoom, zoom);
84  }
85 
86 private:
87  // Algorithm parameters
88  double m_facetDistance;
89  double m_facetAngle;
90  double m_facetSize;
91  double m_edgeSize;
92  std::vector<double> m_facetDistancePerZoom;
93  std::vector<double> m_facetSizePerZoom;
94  std::vector<double> m_edgeSizePerZoom;
95 
96  // Internal functions
97 
99  bool dataPtsArePlanar(const std::vector<Point_3>& dataPts) const;
100 
102  std::vector<Point_3> defaultPointsForPlanarTile() const;
103 
106  Polylines borderPolylineToIndividualEdges(Polyline& poly);
107 };
108 
109 } // End namespace TinCreation
110 
111 #endif //EMODNET_QMGC_TIN_CREATION_REMESHING_H
Polyhedron create(const std::vector< Point_3 > &dataPts, const bool &constrainEasternVertices, const bool &constrainWesternVertices, const bool &constrainNorthernVertices, const bool &constrainSouthernVertices)
Create a TIN from a set of points.
Definition: tin_creation_remeshing_strategy.cpp:35
T standardHandlingOfThresholdPerZoom(const std::vector< T > &thresholdsPerZoom, const unsigned int &zoom, const bool &downScale=true)
Definition: tin_creation_utils.h:43
This namespace contains all the types/classes/functions required to create a TIN out of a regularly g...
Creates a TIN using Delaunay refinement algorithm.
Definition: tin_creation_remeshing_strategy.h:46
void setParamsForZoom(const unsigned int &zoom)
Adapts the parameters of the algorithm for the desired zoom level.
Definition: tin_creation_remeshing_strategy.h:80
Defines the interphase of a TIN creation algorithm.
Definition: tin_creator.h:37