Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--generator/coastlines_generator.cpp1
-rw-r--r--generator/feature_builder.cpp9
-rw-r--r--generator/feature_builder.hpp15
-rw-r--r--generator/feature_generator.cpp2
-rw-r--r--generator/feature_generator.hpp2
-rw-r--r--generator/feature_sorter.cpp52
-rw-r--r--generator/feature_sorter.hpp10
-rw-r--r--geometry/distance.hpp12
-rw-r--r--geometry/geometry_tests/distance_test.cpp19
-rw-r--r--geometry/geometry_tests/simplification_test.cpp29
-rw-r--r--geometry/simplification.hpp35
-rw-r--r--indexer/index.hpp10
-rw-r--r--indexer/indexer_tests/geometry_coding_test.cpp7
13 files changed, 142 insertions, 61 deletions
diff --git a/generator/coastlines_generator.cpp b/generator/coastlines_generator.cpp
index bfeca2623e..989a8e7520 100644
--- a/generator/coastlines_generator.cpp
+++ b/generator/coastlines_generator.cpp
@@ -176,6 +176,7 @@ bool CoastlineFeaturesGenerator::GetFeature(size_t i, FeatureBuilder1 & fb)
doDiff.AssignGeometry(fb);
fb.SetArea();
fb.AddType(m_coastType);
+ fb.SetCoastCell(i);
return true;
}
diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp
index 3d746a2d49..30277b2673 100644
--- a/generator/feature_builder.cpp
+++ b/generator/feature_builder.cpp
@@ -17,6 +17,7 @@ using namespace feature;
///////////////////////////////////////////////////////////////////////////////////////////////////
FeatureBuilder1::FeatureBuilder1()
+: m_coastCell(-1U)
{
m_Polygons.push_back(points_t());
}
@@ -168,6 +169,8 @@ bool FeatureBuilder1::operator == (FeatureBuilder1 const & fb) const
{
if (!(m_Params == fb.m_Params)) return false;
+ if (m_coastCell != fb.m_coastCell) return false;
+
if (m_Params.GetGeomType() == GEOM_POINT &&
!is_equal(m_Center, fb.m_Center))
{
@@ -235,12 +238,14 @@ void FeatureBuilder1::Serialize(buffer_t & data) const
if (m_Params.GetGeomType() != GEOM_POINT)
{
- WriteVarUint(sink, uint32_t(m_Polygons.size()));
+ WriteVarUint(sink, static_cast<uint32_t>(m_Polygons.size()));
for (list<points_t>::const_iterator i = m_Polygons.begin(); i != m_Polygons.end(); ++i)
serial::SaveOuterPath(*i, cp, sink);
}
+ WriteVarUint(sink, m_coastCell);
+
// check for correct serialization
#ifdef DEBUG
buffer_t tmp(data);
@@ -280,6 +285,8 @@ void FeatureBuilder1::Deserialize(buffer_t & data)
CalcRect(m_Polygons.back(), m_LimitRect);
}
+ m_coastCell = ReadVarUint<uint32_t>(source);
+
CHECK ( CheckValid(), () );
}
diff --git a/generator/feature_builder.hpp b/generator/feature_builder.hpp
index 5a64fbb88f..7bb871d803 100644
--- a/generator/feature_builder.hpp
+++ b/generator/feature_builder.hpp
@@ -91,13 +91,24 @@ public:
int GetMinFeatureDrawScale() const;
+ inline void SetCoastCell(uint32_t cell) { m_coastCell = cell; }
+ inline bool GetCoastCell(uint32_t & cell) const
+ {
+ if (m_coastCell != -1U)
+ {
+ cell = m_coastCell;
+ return true;
+ }
+ else return false;
+ }
+
protected:
/// Used for feature debugging
vector<osm::OsmId> m_osmIds;
/// @name For diagnostic use only.
//@{
- bool operator == (FeatureBuilder1 const &) const;
+ bool operator== (FeatureBuilder1 const &) const;
bool CheckValid() const;
//@}
@@ -118,6 +129,8 @@ protected:
/// List of geometry polygons.
list<points_t> m_Polygons; // Check HEADER_IS_AREA
+
+ uint32_t m_coastCell;
};
/// Used for serialization of features during final pass.
diff --git a/generator/feature_generator.cpp b/generator/feature_generator.cpp
index aae1329129..7a8dc91d3a 100644
--- a/generator/feature_generator.cpp
+++ b/generator/feature_generator.cpp
@@ -273,7 +273,7 @@ public:
if (info.m_createWorld)
{
m_world.reset(new WorldMapGenerator<FeaturesCollector>(info));
- m_coasts.reset(new CoastlineFeaturesGenerator(m_coastType));
+ m_coasts.reset(new CoastlineFeaturesGenerator(m_coastType, g_coastsCellLevel));
m_coastsHolder.reset(new FeaturesCollector(
info.m_datFilePrefix + WORLD_COASTS_FILE_NAME + info.m_datFileSuffix));
}
diff --git a/generator/feature_generator.hpp b/generator/feature_generator.hpp
index 40f94f1a64..dbb5e40458 100644
--- a/generator/feature_generator.hpp
+++ b/generator/feature_generator.hpp
@@ -34,4 +34,6 @@ namespace feature
void operator() (FeatureBuilder1 const & f);
};
+
+ static const int g_coastsCellLevel = 6;
}
diff --git a/generator/feature_sorter.cpp b/generator/feature_sorter.cpp
index 795312190f..5c31e2fe59 100644
--- a/generator/feature_sorter.cpp
+++ b/generator/feature_sorter.cpp
@@ -337,11 +337,51 @@ namespace feature
}
};
+ class BoundsDistance : public mn::DistanceToLineSquare<m2::PointD>
+ {
+ double m_eps;
+ double m_minX, m_minY, m_maxX, m_maxY;
+
+ public:
+ BoundsDistance(uint32_t cellID, int level)
+ {
+ RectId cell = RectId::FromBitsAndLevel(cellID, level);
+ CellIdConverter<MercatorBounds, RectId>::GetCellBounds(cell, m_minX, m_minY, m_maxX, m_maxY);
+ }
+
+ void SetEpsilon(double eps) { m_eps = 2.0*eps; }
+
+ double operator() (m2::PointD const & p) const
+ {
+ if (fabs(p.x - m_minX) <= m_eps || fabs(p.x - m_maxX) <= m_eps ||
+ fabs(p.y - m_minY) <= m_eps || fabs(p.y - m_maxY) <= m_eps)
+ {
+ return std::numeric_limits<double>::max();
+ }
+
+ return mn::DistanceToLineSquare<m2::PointD>::operator()(p);
+ }
+ };
+
+ void SimplifyPoints(points_t const & in, points_t & out, int level,
+ FeatureBuilder2 const & fb)
+ {
+ uint32_t cellID;
+ if (fb.GetCoastCell(cellID))
+ {
+ BoundsDistance dist(cellID, g_coastsCellLevel);
+ feature::SimplifyPoints(dist, in, out, level);
+ }
+ else
+ {
+ mn::DistanceToLineSquare<m2::PointD> dist;
+ feature::SimplifyPoints(dist, in, out, level);
+ }
+ }
+
public:
void operator() (FeatureBuilder2 & fb)
{
- (void)GetFileSize(m_datFile);
-
GeometryHolder holder(*this, fb, m_header.GetCodingParams());
bool const isLine = fb.IsLine();
@@ -349,11 +389,12 @@ namespace feature
for (int i = m_header.GetScalesCount()-1; i >= 0; --i)
{
- if (fb.IsDrawableInRange(i > 0 ? m_header.GetScale(i-1) + 1 : 0, m_header.GetScale(i)))
+ int const level = m_header.GetScale(i);
+ if (fb.IsDrawableInRange(i > 0 ? m_header.GetScale(i-1) + 1 : 0, level))
{
// simplify and serialize geometry
points_t points;
- SimplifyPoints(holder.GetSourcePoints(), points, m_header.GetScale(i));
+ SimplifyPoints(holder.GetSourcePoints(), points, level, fb);
if (isLine)
holder.AddPoints(points, i);
@@ -374,7 +415,7 @@ namespace feature
{
simplified.push_back(points_t());
- SimplifyPoints(*iH, simplified.back(), m_header.GetScale(i));
+ SimplifyPoints(*iH, simplified.back(), level, fb);
if (simplified.back().size() < 3)
simplified.pop_back();
@@ -453,7 +494,6 @@ namespace feature
// remove old not-sorted dat file
FileWriter::DeleteFileX(tempDatFilePath);
-
FileWriter::DeleteFileX(datFilePath + DATA_FILE_TAG);
return true;
diff --git a/generator/feature_sorter.hpp b/generator/feature_sorter.hpp
index 39e2c60a35..02e5279dcc 100644
--- a/generator/feature_sorter.hpp
+++ b/generator/feature_sorter.hpp
@@ -25,16 +25,16 @@ namespace feature
return AlmostEqual(p1, p2);
}
- template <class PointsContainerT>
- void SimplifyPoints(PointsContainerT const & in, PointsContainerT & out, int level)
+ template <class DistanceT, class PointsContainerT>
+ void SimplifyPoints(DistanceT dist, PointsContainerT const & in, PointsContainerT & out, int level)
{
if (in.size() >= 2)
{
- typedef mn::DistanceToLineSquare<m2::PointD> DistanceF;
double const eps = my::sq(scales::GetEpsilonForSimplify(level));
+ dist.SetEpsilon(eps);
- SimplifyNearOptimal<DistanceF>(20, in.begin(), in.end(), eps,
- AccumulateSkipSmallTrg<DistanceF, m2::PointD>(out, eps));
+ SimplifyNearOptimal(20, in.begin(), in.end(), eps, dist,
+ AccumulateSkipSmallTrg<DistanceT, m2::PointD>(dist, out, eps));
CHECK_GREATER ( out.size(), 1, () );
CHECK ( are_points_equal(in.front(), out.front()), () );
diff --git a/geometry/distance.hpp b/geometry/distance.hpp
index d6e93ae5a5..b4097851c3 100644
--- a/geometry/distance.hpp
+++ b/geometry/distance.hpp
@@ -17,9 +17,15 @@ private:
STATIC_ASSERT(numeric_limits<typename PointT::value_type>::is_signed);
public:
- DistanceToLineSquare(PointT const & p0, PointT const & p1)
- : m_P0(p0), m_P1(p1), m_D(m_P1 - m_P0), m_D2(DotProduct(m_D, m_D))
+ void SetEpsilon(double) {}
+
+ void SetBounds(PointT const & p0, PointT const & p1)
{
+ m_P0 = p0;
+ m_P1 = p1;
+ m_D = m_P1 - m_P0;
+ m_D2 = DotProduct(m_D, m_D);
+
m_D2 = sqrt(m_D2);
if (my::AlmostEqual(m_D2, 0.0))
{
@@ -33,7 +39,7 @@ public:
}
}
- double operator () (PointT Y) const
+ double operator() (PointT Y) const
{
m2::PointD const YmP0 = Y - m_P0;
double const t = DotProduct(m_D, YmP0);
diff --git a/geometry/geometry_tests/distance_test.cpp b/geometry/geometry_tests/distance_test.cpp
index ed22f6f6d3..fe86bca390 100644
--- a/geometry/geometry_tests/distance_test.cpp
+++ b/geometry/geometry_tests/distance_test.cpp
@@ -5,7 +5,8 @@
template <class PointT>
void FloatingPointsTest()
{
- mn::DistanceToLineSquare<PointT> d(PointT(-1, 3), PointT(2, 1));
+ mn::DistanceToLineSquare<PointT> d;
+ d.SetBounds(PointT(-1, 3), PointT(2, 1));
TEST_ALMOST_EQUAL(d(PointT(-1, 3)), 0.0, ());
TEST_ALMOST_EQUAL(d(PointT(2, 1)), 0.0, ());
@@ -25,21 +26,23 @@ UNIT_TEST(DistanceToLineSquare2D_Floating)
UNIT_TEST(DistanceToLineSquare2D_Integer)
{
- mn::DistanceToLineSquare<m2::PointI> dI(m2::PointI(-1, 3), m2::PointI(2, 1));
+ mn::DistanceToLineSquare<m2::PointI> d;
+ d.SetBounds(m2::PointI(-1, 3), m2::PointI(2, 1));
- TEST_ALMOST_EQUAL(dI(m2::PointI(-1, 3)), 0.0, ());
- TEST_ALMOST_EQUAL(dI(m2::PointI(2, 1)), 0.0, ());
- TEST_ALMOST_EQUAL(dI(m2::PointI(4, 4)), 13.0, ());
+ TEST_ALMOST_EQUAL(d(m2::PointI(-1, 3)), 0.0, ());
+ TEST_ALMOST_EQUAL(d(m2::PointI(2, 1)), 0.0, ());
+ TEST_ALMOST_EQUAL(d(m2::PointI(4, 4)), 13.0, ());
double const sqSin = 4.0 / m2::PointI(-1, 3).SquareLength(m2::PointI(2, 1));
- TEST_ALMOST_EQUAL(dI(m2::PointI(0, 1)), 4.0*sqSin, ());
- TEST_ALMOST_EQUAL(dI(m2::PointI(-1, 1)), 9.0*sqSin, ());
+ TEST_ALMOST_EQUAL(d(m2::PointI(0, 1)), 4.0*sqSin, ());
+ TEST_ALMOST_EQUAL(d(m2::PointI(-1, 1)), 9.0*sqSin, ());
}
UNIT_TEST(DistanceToLineSquare2D_DegenerateSection)
{
typedef m2::PointD P;
- mn::DistanceToLineSquare<P> d(P(5, 5), P(5, 5));
+ mn::DistanceToLineSquare<P> d;
+ d.SetBounds(P(5, 5), P(5, 5));
TEST_ALMOST_EQUAL(d(P(5, 5)), 0.0, ());
TEST_ALMOST_EQUAL(d(P(6, 6)), 2.0, ());
diff --git a/geometry/geometry_tests/simplification_test.cpp b/geometry/geometry_tests/simplification_test.cpp
index 9a457fe02a..58e7a573dc 100644
--- a/geometry/geometry_tests/simplification_test.cpp
+++ b/geometry/geometry_tests/simplification_test.cpp
@@ -20,7 +20,8 @@ namespace
typedef m2::PointD P;
typedef mn::DistanceToLineSquare<m2::PointD> DistanceF;
typedef BackInsertFunctor<vector<m2::PointD> > PointOutput;
-typedef void (* SimplifyFn)(m2::PointD const *, m2::PointD const *, double, PointOutput);
+typedef void (* SimplifyFn)(m2::PointD const *, m2::PointD const *, double,
+ DistanceF, PointOutput);
struct LargePolylineTestData
{
@@ -33,7 +34,7 @@ void TestSimplificationSmoke(SimplifyFn simplifyFn)
m2::PointD const points[] = { P(0.0, 1.0), P(2.2, 3.6), P(3.2, 3.6) };
double const epsilon = 0.1;
vector<m2::PointD> result, expectedResult(points, points + 3);
- simplifyFn(points, points + 3, epsilon, MakeBackInsertFunctor(result));
+ simplifyFn(points, points + 3, epsilon, DistanceF(), MakeBackInsertFunctor(result));
TEST_EQUAL(result, expectedResult, (epsilon));
}
@@ -43,7 +44,7 @@ void TestSimplificationOfLine(SimplifyFn simplifyFn)
for (double epsilon = numeric_limits<double>::denorm_min(); epsilon < 1000; epsilon *= 2)
{
vector<m2::PointD> result, expectedResult(points, points + 2);
- simplifyFn(points, points + 2, epsilon, MakeBackInsertFunctor(result));
+ simplifyFn(points, points + 2, epsilon, DistanceF(), MakeBackInsertFunctor(result));
TEST_EQUAL(result, expectedResult, (epsilon));
}
}
@@ -53,7 +54,7 @@ void TestSimplificationOfPoly(m2::PointD const * points, size_t count, SimplifyF
for (double epsilon = 0.00001; epsilon < 0.11; epsilon *= 10)
{
vector<m2::PointD> result;
- simplifyFn(points, points + count, epsilon, MakeBackInsertFunctor(result));
+ simplifyFn(points, points + count, epsilon, DistanceF(), MakeBackInsertFunctor(result));
LOG(LINFO, ("eps:", epsilon, "size:", result.size()));
TEST_GREATER(result.size(), 1, ());
@@ -90,13 +91,15 @@ UNIT_TEST(Simplification_DP_Polyline)
namespace
{
-void SimplifyNearOptimal10(m2::PointD const * f, m2::PointD const * l, double e, PointOutput out)
+void SimplifyNearOptimal10(m2::PointD const * f, m2::PointD const * l, double e,
+ DistanceF dist, PointOutput out)
{
- SimplifyNearOptimal<DistanceF>(10, f, l, e, out);
+ SimplifyNearOptimal(10, f, l, e, dist, out);
}
-void SimplifyNearOptimal20(m2::PointD const * f, m2::PointD const * l, double e, PointOutput out)
+void SimplifyNearOptimal20(m2::PointD const * f, m2::PointD const * l, double e,
+ DistanceF dist, PointOutput out)
{
- SimplifyNearOptimal<DistanceF>(20, f, l, e, out);
+ SimplifyNearOptimal(20, f, l, e, dist, out);
}
}
@@ -128,8 +131,9 @@ namespace
void CheckDPStrict(P const * arr, size_t n, double eps, size_t expectedCount)
{
vector<P> vec;
- SimplifyDP<DistanceF>(arr, arr + n, eps,
- AccumulateSkipSmallTrg<DistanceF, P>(vec, eps));
+ DistanceF dist;
+ SimplifyDP(arr, arr + n, eps, dist,
+ AccumulateSkipSmallTrg<DistanceF, P>(dist, vec, eps));
TEST_GREATER(vec.size(), 1, ());
TEST_EQUAL(arr[0], vec.front(), ());
@@ -142,8 +146,9 @@ namespace
for (size_t i = 2; i < vec.size(); ++i)
{
- DistanceF fun(vec[i-2], vec[i]);
- TEST_GREATER_OR_EQUAL(fun(vec[i-1]), eps, ());
+ DistanceF d;
+ d.SetBounds(vec[i-2], vec[i]);
+ TEST_GREATER_OR_EQUAL(d(vec[i-1]), eps, ());
}
}
}
diff --git a/geometry/simplification.hpp b/geometry/simplification.hpp
index 08d4fdeaca..85b227151f 100644
--- a/geometry/simplification.hpp
+++ b/geometry/simplification.hpp
@@ -19,19 +19,19 @@ namespace impl
///@name This functions take input range NOT like STL does: [first, last].
//@{
template <typename DistanceF, typename IterT>
-pair<double, IterT> MaxDistance(IterT first, IterT last)
+pair<double, IterT> MaxDistance(IterT first, IterT last, DistanceF & dist)
{
pair<double, IterT> res(0.0, last);
if (distance(first, last) <= 1)
return res;
- DistanceF distanceF(*first, *last);
+ dist.SetBounds(*first, *last);
for (IterT i = first + 1; i != last; ++i)
{
- double const dist = distanceF(*i);
- if (dist > res.first)
+ double const d = dist(*i);
+ if (d > res.first)
{
- res.first = dist;
+ res.first = d;
res.second = i;
}
}
@@ -40,17 +40,17 @@ pair<double, IterT> MaxDistance(IterT first, IterT last)
// Actual SimplifyDP implementation.
template <typename DistanceF, typename IterT, typename OutT>
-void SimplifyDP(IterT first, IterT last, double epsilon, OutT & out)
+void SimplifyDP(IterT first, IterT last, double epsilon, DistanceF & dist, OutT & out)
{
- pair<double, IterT> maxDist = impl::MaxDistance<DistanceF>(first, last);
+ pair<double, IterT> maxDist = impl::MaxDistance(first, last, dist);
if (maxDist.second == last || maxDist.first < epsilon)
{
out(*last);
}
else
{
- impl::SimplifyDP<DistanceF>(first, maxDist.second, epsilon, out);
- impl::SimplifyDP<DistanceF>(maxDist.second, last, epsilon, out);
+ impl::SimplifyDP(first, maxDist.second, epsilon, dist, out);
+ impl::SimplifyDP(maxDist.second, last, epsilon, dist, out);
}
}
//@}
@@ -71,12 +71,12 @@ struct SimplifyOptimalRes
// Iteratively includes the point with max distance form the current simplification.
// Average O(n log n), worst case O(n^2).
template <typename DistanceF, typename IterT, typename OutT>
-void SimplifyDP(IterT beg, IterT end, double epsilon, OutT out)
+void SimplifyDP(IterT beg, IterT end, double epsilon, DistanceF dist, OutT out)
{
if (beg != end)
{
out(*beg);
- impl::SimplifyDP<DistanceF>(beg, end-1, epsilon, out);
+ impl::SimplifyDP(beg, end-1, epsilon, dist, out);
}
}
@@ -87,7 +87,8 @@ void SimplifyDP(IterT beg, IterT end, double epsilon, OutT out)
// Essentially, it's a trade-off between optimality and performance.
// Values around 20 - 200 are reasonable.
template <typename DistanceF, typename IterT, typename OutT>
-void SimplifyNearOptimal(int kMaxFalseLookAhead, IterT beg, IterT end, double epsilon, OutT out)
+void SimplifyNearOptimal(int kMaxFalseLookAhead, IterT beg, IterT end,
+ double epsilon, DistanceF dist, OutT out)
{
int32_t const n = end - beg;
if (n <= 2)
@@ -106,7 +107,7 @@ void SimplifyNearOptimal(int kMaxFalseLookAhead, IterT beg, IterT end, double ep
uint32_t const newPointCount = F[j].m_PointCount + 1;
if (newPointCount < F[i].m_PointCount)
{
- if (impl::MaxDistance<DistanceF>(beg + i, beg + j).first < epsilon)
+ if (impl::MaxDistance(beg + i, beg + j, dist).first < epsilon)
{
F[i].m_NextPoint = j;
F[i].m_PointCount = newPointCount;
@@ -129,12 +130,13 @@ void SimplifyNearOptimal(int kMaxFalseLookAhead, IterT beg, IterT end, double ep
template <class DistanceF, class PointT>
class AccumulateSkipSmallTrg
{
+ DistanceF & m_dist;
vector<PointT> & m_vec;
double m_eps;
public:
- AccumulateSkipSmallTrg(vector<PointT> & vec, double eps)
- : m_vec(vec), m_eps(eps)
+ AccumulateSkipSmallTrg(DistanceF & dist, vector<PointT> & vec, double eps)
+ : m_dist(dist), m_vec(vec), m_eps(eps)
{
}
@@ -144,7 +146,8 @@ public:
size_t count;
while ((count = m_vec.size()) >= 2)
{
- if (DistanceF(m_vec[count-2], p)(m_vec[count-1]) < m_eps)
+ m_dist.SetBounds(m_vec[count-2], p);
+ if (m_dist(m_vec[count-1]) < m_eps)
m_vec.pop_back();
else
break;
diff --git a/indexer/index.hpp b/indexer/index.hpp
index 236d18c164..e8c7fa77c6 100644
--- a/indexer/index.hpp
+++ b/indexer/index.hpp
@@ -146,11 +146,11 @@ public:
UpdateIndexes();
- if (m_indexes.back()->IsWorldData())
- {
- ASSERT ( !m_pWorldSearchInfo.get(), () );
- m_pWorldSearchInfo.reset(m_indexes.back()->GetSearchInfo());
- }
+ //if (m_indexes.back()->IsWorldData())
+ //{
+ // ASSERT ( !m_pWorldSearchInfo.get(), () );
+ // m_pWorldSearchInfo.reset(m_indexes.back()->GetSearchInfo());
+ //}
}
void Remove(string const & file)
diff --git a/indexer/indexer_tests/geometry_coding_test.cpp b/indexer/indexer_tests/geometry_coding_test.cpp
index 87735f0f15..0dc3e3c7f3 100644
--- a/indexer/indexer_tests/geometry_coding_test.cpp
+++ b/indexer/indexer_tests/geometry_coding_test.cpp
@@ -127,8 +127,9 @@ vector<m2::PointU> SimplifyPoints(vector<m2::PointU> const & points, double eps)
{
vector<m2::PointU> simpPoints;
typedef mn::DistanceToLineSquare<m2::PointD> DistanceF;
- SimplifyNearOptimal<DistanceF>(20, points.begin(), points.end(), eps,
- AccumulateSkipSmallTrg<DistanceF, m2::PointU>(simpPoints, eps));
+ DistanceF dist;
+ SimplifyNearOptimal(20, points.begin(), points.end(), eps, dist,
+ AccumulateSkipSmallTrg<DistanceF, m2::PointU>(dist, simpPoints, eps));
return simpPoints;
}
@@ -169,4 +170,4 @@ UNIT_TEST(EncodePolyline)
}
}
-// see 476c1d1d125f0c2deb8c commit for special decode test \ No newline at end of file
+// see 476c1d1d125f0c2deb8c commit for special decode test