Optimize remove_duplicate_points.
This commit is contained in:
parent
42d9db04f2
commit
79c5e0a52d
2 changed files with 27 additions and 6 deletions
|
@ -102,15 +102,33 @@ MultiPoint::bounding_box() const
|
||||||
return BoundingBox(this->points);
|
return BoundingBox(this->points);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
|
MultiPoint::has_duplicate_points() const
|
||||||
|
{
|
||||||
|
for (size_t i = 1; i < points.size(); ++i)
|
||||||
|
if (points[i-1].coincides_with(points[i]))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
MultiPoint::remove_duplicate_points()
|
MultiPoint::remove_duplicate_points()
|
||||||
{
|
{
|
||||||
for (size_t i = 1; i < this->points.size(); ++i) {
|
size_t j = 0;
|
||||||
if (this->points.at(i).coincides_with(this->points.at(i-1))) {
|
for (size_t i = 1; i < points.size(); ++i) {
|
||||||
this->points.erase(this->points.begin() + i);
|
if (points[j].coincides_with(points[i])) {
|
||||||
--i;
|
// Just increase index i.
|
||||||
|
} else {
|
||||||
|
++ j;
|
||||||
|
if (j < i)
|
||||||
|
points[j] = points[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (++ j < points.size()) {
|
||||||
|
points.erase(points.begin() + j, points.end());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -33,7 +33,10 @@ class MultiPoint
|
||||||
int find_point(const Point &point) const;
|
int find_point(const Point &point) const;
|
||||||
bool has_boundary_point(const Point &point) const;
|
bool has_boundary_point(const Point &point) const;
|
||||||
BoundingBox bounding_box() const;
|
BoundingBox bounding_box() const;
|
||||||
void remove_duplicate_points();
|
// Return true if there are exact duplicates.
|
||||||
|
bool has_duplicate_points() const;
|
||||||
|
// Remove exact duplicates, return true if any duplicate has been removed.
|
||||||
|
bool remove_duplicate_points();
|
||||||
void append(const Point &point);
|
void append(const Point &point);
|
||||||
void append(const Points &points);
|
void append(const Points &points);
|
||||||
void append(const Points::const_iterator &begin, const Points::const_iterator &end);
|
void append(const Points::const_iterator &begin, const Points::const_iterator &end);
|
||||||
|
|
Loading…
Reference in a new issue