Move DP thresholds back to header, since they are needed for testing
Conflicts: Algorithms/DouglasPeucker.cpp
This commit is contained in:
parent
27caab69ec
commit
096208a154
@ -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;
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user