2014-11-28 04:07:06 -05:00
|
|
|
#ifndef DOUGLAS_PEUCKER_HPP_
|
|
|
|
#define DOUGLAS_PEUCKER_HPP_
|
|
|
|
|
2016-01-02 11:13:44 -05:00
|
|
|
#include "engine/segment_information.hpp"
|
2015-02-09 11:38:40 -05:00
|
|
|
|
|
|
|
#include <array>
|
2014-11-28 04:07:06 -05:00
|
|
|
#include <stack>
|
2015-02-09 11:38:40 -05:00
|
|
|
#include <utility>
|
2014-11-28 04:07:06 -05:00
|
|
|
#include <vector>
|
2015-02-09 11:38:40 -05:00
|
|
|
|
2014-11-28 04:07:06 -05:00
|
|
|
/* This class object computes the bitvector of indicating generalized input
|
|
|
|
* points according to the (Ramer-)Douglas-Peucker algorithm.
|
|
|
|
*
|
|
|
|
* Input is vector of pairs. Each pair consists of the point information and a
|
|
|
|
* bit indicating if the points is present in the generalization.
|
|
|
|
* Note: points may also be pre-selected*/
|
|
|
|
|
2015-02-19 03:19:51 -05:00
|
|
|
static const std::array<int, 19> DOUGLAS_PEUCKER_THRESHOLDS{{
|
2014-11-28 04:07:06 -05:00
|
|
|
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
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
using RandomAccessIt = std::vector<SegmentInformation>::iterator;
|
|
|
|
|
|
|
|
using GeometryRange = std::pair<RandomAccessIt, RandomAccessIt>;
|
|
|
|
// Stack to simulate the recursion
|
|
|
|
std::stack<GeometryRange> recursion_stack;
|
|
|
|
|
|
|
|
public:
|
|
|
|
void Run(RandomAccessIt begin, RandomAccessIt end, const unsigned zoom_level);
|
|
|
|
void Run(std::vector<SegmentInformation> &input_geometry, const unsigned zoom_level);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* DOUGLAS_PEUCKER_HPP_ */
|