Move DP thresholds back to header, since they are needed for testing

Conflicts:
	Algorithms/DouglasPeucker.cpp
This commit is contained in:
Patrick Niklaus 2014-10-28 00:15:20 +01:00
parent 27caab69ec
commit 096208a154
2 changed files with 25 additions and 30 deletions

View File

@ -83,31 +83,6 @@ struct CoordinatePairCalculator
}; };
} }
DouglasPeucker::DouglasPeucker()
: douglas_peucker_thresholds({
512440, // z0
256720, // z1
122560, // z2
56780, // z3
28800, // z4
14400, // z5
7200, // z6
3200, // z7
2400, // z8
1000, // z9
600, // z10
120, // z11
60, // z12
45, // z13
36, // z14
20, // z15
8, // z16
6, // z17
4 // z18
})
{
}
void DouglasPeucker::Run(std::vector<SegmentInformation> &input_geometry, const unsigned zoom_level) void DouglasPeucker::Run(std::vector<SegmentInformation> &input_geometry, const unsigned zoom_level)
{ {
Run(std::begin(input_geometry), std::end(input_geometry), zoom_level); Run(std::begin(input_geometry), std::end(input_geometry), zoom_level);
@ -165,15 +140,16 @@ void DouglasPeucker::Run(RandomAccessIt begin, RandomAccessIt end, const unsigne
{ {
const int distance = dist_calc(it->location); const int distance = dist_calc(it->location);
// found new feasible maximum? // found new feasible maximum?
if (distance > max_int_distance && distance > douglas_peucker_thresholds[zoom_level]) if (distance > max_int_distance && distance > DOUGLAS_PEUCKER_THRESHOLDS[zoom_level])
{ {
farthest_entry_it = it; farthest_entry_it = it;
max_int_distance = distance; max_int_distance = distance;
} }
} }
// check if maximum violates a zoom level dependent threshold // check if maximum violates a zoom level dependent threshold
if (max_int_distance > douglas_peucker_thresholds[zoom_level]) if (max_int_distance > DOUGLAS_PEUCKER_THRESHOLDS[zoom_level])
{ {
// mark idx as necessary // mark idx as necessary
farthest_entry_it->necessary = true; farthest_entry_it->necessary = true;

View File

@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <stack> #include <stack>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <array>
/* This class object computes the bitvector of indicating generalized input /* This class object computes the bitvector of indicating generalized input
* points according to the (Ramer-)Douglas-Peucker algorithm. * points according to the (Ramer-)Douglas-Peucker algorithm.
@ -40,20 +41,38 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* Note: points may also be pre-selected*/ * Note: points may also be pre-selected*/
struct SegmentInformation; struct SegmentInformation;
static const std::array<int, 19> DOUGLAS_PEUCKER_THRESHOLDS = {
512440, // z0
256720, // z1
122560, // z2
56780, // z3
28800, // z4
14400, // z5
7200, // z6
3200, // z7
2400, // z8
1000, // z9
600, // z10
120, // z11
60, // z12
45, // z13
36, // z14
20, // z15
8, // z16
6, // z17
4 // z18
};
class DouglasPeucker class DouglasPeucker
{ {
public: public:
using RandomAccessIt = std::vector<SegmentInformation>::iterator; using RandomAccessIt = std::vector<SegmentInformation>::iterator;
private:
std::vector<int> douglas_peucker_thresholds;
using GeometryRange = std::pair<RandomAccessIt, RandomAccessIt>; using GeometryRange = std::pair<RandomAccessIt, RandomAccessIt>;
// Stack to simulate the recursion // Stack to simulate the recursion
std::stack<GeometryRange> recursion_stack; std::stack<GeometryRange> recursion_stack;
public: public:
DouglasPeucker();
void Run(RandomAccessIt begin, RandomAccessIt end, const unsigned zoom_level); void Run(RandomAccessIt begin, RandomAccessIt end, const unsigned zoom_level);
void Run(std::vector<SegmentInformation> &input_geometry, const unsigned zoom_level); void Run(std::vector<SegmentInformation> &input_geometry, const unsigned zoom_level);
}; };