-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1217 from TheMarex/sketch-upstream
Bring general sketch commits upstream
- v5.27.1
- v5.27.0
- v5.27.0-rc.1
- v5.26.0
- v5.26.0-rc.2
- v5.26.0-rc.1
- v5.25.0
- v5.25.0-rc.2
- v5.25.0-rc.1
- v5.24.0
- v5.23.0
- v5.23.0-rc.2
- v5.23.0-rc.1
- v5.22.0
- v5.22.0+customsnapping.5
- v5.22.0+customsnapping.4
- v5.22.0+customsnapping.3
- v5.22.0+customsnapping.2
- v5.22.0+customsnapping.1
- v5.22.0-rc.2
- v5.22.0-rc.1
- v5.22.0-customsnapping.3
- v5.22.0-customsnapping.2
- v5.22.0-customsnapping.1
- v5.21.0
- v5.21.0-rc.1
- v5.21.0-customsnapping.11
- v5.21.0-customsnapping.10
- v5.21.0-customsnapping.9
- v5.21.0-customsnapping.8
- v5.21.0-customsnapping.7
- v5.21.0-customsnapping.6
- v5.21.0-customsnapping.5
- v5.21.0-customsnapping.4
- v5.21.0-customsnapping.3
- v5.21.0-customsnapping.2
- v5.21.0-customsnapping.1
- v5.20.1-rc.4
- v5.20.1-rc.3
- v5.20.1-rc.2
- v5.20.1-rc.1
- v5.20.0
- v5.20.0-rc.6
- v5.20.0-rc.5
- v5.20.0-rc.4
- v5.20.0-rc.3
- v5.20.0-rc.2
- v5.20.0-rc.1
- v5.20.0-alpha.4
- v5.20.0-alpha.3
- v5.20.0-alpha.2
- v5.20.0-alpha.1
- v5.19.0
- v5.19.0-rc.1
- v5.18.0
- v5.18.0-rc.1
- v5.18.0-moarshm.5
- v5.18.0-moarshm.4
- v5.18.0-moarshm.3
- v5.18.0-moarshm.2
- v5.18.0-moarshm.1
- v5.17.3
- v5.17.2
- v5.17.1
- v5.17.0
- v5.17.0-rc.5
- v5.17.0-rc.4
- v5.17.0-rc.3
- v5.17.0-rc.2
- v5.17.0-rc.1
- v5.16.6
- v5.16.5
- v5.16.4
- v5.16.3
- v5.16.2
- v5.16.1
- v5.16.0
- v5.16.0-rc.7
- v5.16.0-rc.6
- v5.16.0-rc.5
- v5.16.0-rc.4
- v5.16.0-rc.3
- v5.16.0-rc.2
- v5.16.0-rc.1
- v5.15.3
- v5.15.2
- v5.15.1
- v5.15.0
- v5.15.0-rc.3
- v5.15.0-rc.2
- v5.15.0-rc.1
- v5.15.0-latest.4
- v5.15.0-latest.3
- v5.15.0-latest.2
- v5.15.0-lastest.2
- v5.15.0-lastest.1
- v5.14.3
- v5.14.2
- v5.14.1
- v5.14.0
- v5.14.0-rc.1
- v5.13.0
- v5.13.0-rc.4
- v5.13.0-rc.3
- v5.13.0-rc.2
- v5.13.0-rc.1
- v5.13.0-glibc.2
- v5.13.0-glibc.1
- v5.13.0-cardinal.1
- v5.12.0
- v5.12.0-roundaboutexits.1
- v5.12.0-rc.1
- v5.11.0
- v5.11.0-rc.3
- v5.11.0-rc.2
- v5.11.0-rc.1
- v5.10.0
- v5.10.0-rc.2
- v5.10.0-rc.1
- v5.9.2
- v5.9.1
- v5.9.0
- v5.9.0-rc.3
- v5.9.0-rc.2
- v5.9.0-rc.1
- v5.8.1
- v5.8.0
- v5.8.0-rc.1
- v5.8.0-latest.1
- v5.7.4
- v5.7.3
- v5.7.2
- v5.7.1
- v5.7.0
- v5.7.0-rc.3
- v5.7.0-rc.2
- v5.7.0-rc.1
- v5.7.0-latest.6
- v5.7.0-latest.5
- v5.7.0-latest.4
- v5.7.0-latest.3
- v5.7.0-latest.2
- v5.7.0-latest.1
- v5.7.0-alpha.1
- v5.6.5
- v5.6.4
- v5.6.3
- v5.6.2
- v5.6.1
- v5.6.0
- v5.6.0-rc.2
- v5.6.0-rc.1
- v5.6.0-beta.1
- v5.5.4
- v5.5.3
- v5.5.2
- v5.5.1
- v5.5.0
- v5.5.0-rc.5
- v5.5.0-rc.4
- v5.5.0-rc.3
- v5.5.0-rc.2
- v5.5.0-rc.1
- v5.4.3
- v5.4.2
- v5.4.1
- v5.4.0
- v5.4.0-rc.7
- v5.4.0-rc.6
- v5.4.0-rc.5
- v5.4.0-rc.4
- v5.4.0-rc.4-c++11
- v5.4.0-rc.3
- v5.4.0-rc.2
- v5.4.0-rc.1
- v5.3.3
- v5.3.2
- v5.3.1
- v5.3.0
- v5.3.0-rc.3
- v5.3.0-rc.2
- v5.3.0-rc.1
- v5.2.8
- v5.2.7
- v5.2.6
- v5.2.5
- v5.2.4
- v5.2.3
- v5.2.2
- v5.2.1
- v5.2.0
- v5.2.0-rc.2
- v5.2.0-rc.1
- v5.1.0
- v5.1.0-rc.2
- v5.1.0-rc.1
- v5.0.2
- v5.0.1
- v5.0.0
- v5.0.0-rc.2
- v5.0.0-rc.1
- v5.0.0-newapi.7
- v5.0.0-newapi.6
- v5.0.0-newapi.5
- v4.9.1
- v4.9.0
- v4.8.1
- v4.8.0
- v4.7.1
- v4.7.0
- v4.6.1
- v4.6.0
- v4.5.0
- v0.4.4
Showing
7 changed files
with
278 additions
and
216 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
#ifndef RECTANGLE_H | ||
#define RECTANGLE_H | ||
|
||
#include <boost/assert.hpp> | ||
|
||
#include <algorithm> | ||
#include <cstdint> | ||
#include <limits> | ||
|
||
// TODO: Make template type, add tests | ||
struct RectangleInt2D | ||
{ | ||
RectangleInt2D() : min_lon(std::numeric_limits<int32_t>::max()), | ||
max_lon(std::numeric_limits<int32_t>::min()), | ||
min_lat(std::numeric_limits<int32_t>::max()), | ||
max_lat(std::numeric_limits<int32_t>::min()) {} | ||
|
||
int32_t min_lon, max_lon; | ||
int32_t min_lat, max_lat; | ||
|
||
inline void MergeBoundingBoxes(const RectangleInt2D &other) | ||
{ | ||
min_lon = std::min(min_lon, other.min_lon); | ||
max_lon = std::max(max_lon, other.max_lon); | ||
min_lat = std::min(min_lat, other.min_lat); | ||
max_lat = std::max(max_lat, other.max_lat); | ||
BOOST_ASSERT(min_lat != std::numeric_limits<int32_t>::min()); | ||
BOOST_ASSERT(min_lon != std::numeric_limits<int32_t>::min()); | ||
BOOST_ASSERT(max_lat != std::numeric_limits<int32_t>::min()); | ||
BOOST_ASSERT(max_lon != std::numeric_limits<int32_t>::min()); | ||
} | ||
|
||
inline FixedPointCoordinate Centroid() const | ||
{ | ||
FixedPointCoordinate centroid; | ||
// The coordinates of the midpoints are given by: | ||
// x = (x1 + x2) /2 and y = (y1 + y2) /2. | ||
centroid.lon = (min_lon + max_lon) / 2; | ||
centroid.lat = (min_lat + max_lat) / 2; | ||
return centroid; | ||
} | ||
|
||
inline bool Intersects(const RectangleInt2D &other) const | ||
{ | ||
FixedPointCoordinate upper_left(other.max_lat, other.min_lon); | ||
FixedPointCoordinate upper_right(other.max_lat, other.max_lon); | ||
FixedPointCoordinate lower_right(other.min_lat, other.max_lon); | ||
FixedPointCoordinate lower_left(other.min_lat, other.min_lon); | ||
|
||
return (Contains(upper_left) || Contains(upper_right) || Contains(lower_right) || | ||
Contains(lower_left)); | ||
} | ||
|
||
inline float GetMinDist(const FixedPointCoordinate &location) const | ||
{ | ||
const bool is_contained = Contains(location); | ||
if (is_contained) | ||
{ | ||
return 0.0f; | ||
} | ||
|
||
enum Direction | ||
{ | ||
INVALID = 0, | ||
NORTH = 1, | ||
SOUTH = 2, | ||
EAST = 4, | ||
NORTH_EAST = 5, | ||
SOUTH_EAST = 6, | ||
WEST = 8, | ||
NORTH_WEST = 9, | ||
SOUTH_WEST = 10 | ||
}; | ||
|
||
Direction d = INVALID; | ||
if (location.lat > max_lat) | ||
d = (Direction) (d | NORTH); | ||
else if (location.lat < min_lat) | ||
d = (Direction) (d | SOUTH); | ||
if (location.lon > max_lon) | ||
d = (Direction) (d | EAST); | ||
else if (location.lon < min_lon) | ||
d = (Direction) (d | WEST); | ||
|
||
BOOST_ASSERT(d != INVALID); | ||
|
||
float min_dist = std::numeric_limits<float>::max(); | ||
switch (d) | ||
{ | ||
case NORTH: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(max_lat, location.lon)); | ||
break; | ||
case SOUTH: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(min_lat, location.lon)); | ||
break; | ||
case WEST: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(location.lat, min_lon)); | ||
break; | ||
case EAST: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(location.lat, max_lon)); | ||
break; | ||
case NORTH_EAST: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(max_lat, max_lon)); | ||
break; | ||
case NORTH_WEST: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(max_lat, min_lon)); | ||
break; | ||
case SOUTH_EAST: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(min_lat, max_lon)); | ||
break; | ||
case SOUTH_WEST: | ||
min_dist = FixedPointCoordinate::ApproximateEuclideanDistance(location, FixedPointCoordinate(min_lat, min_lon)); | ||
break; | ||
default: | ||
break; | ||
} | ||
|
||
BOOST_ASSERT(min_dist != std::numeric_limits<float>::max()); | ||
|
||
return min_dist; | ||
} | ||
|
||
inline float GetMinMaxDist(const FixedPointCoordinate &location) const | ||
{ | ||
float min_max_dist = std::numeric_limits<float>::max(); | ||
// Get minmax distance to each of the four sides | ||
const FixedPointCoordinate upper_left(max_lat, min_lon); | ||
const FixedPointCoordinate upper_right(max_lat, max_lon); | ||
const FixedPointCoordinate lower_right(min_lat, max_lon); | ||
const FixedPointCoordinate lower_left(min_lat, min_lon); | ||
|
||
min_max_dist = std::min( | ||
min_max_dist, | ||
std::max( | ||
FixedPointCoordinate::ApproximateEuclideanDistance(location, upper_left), | ||
FixedPointCoordinate::ApproximateEuclideanDistance(location, upper_right))); | ||
|
||
min_max_dist = std::min( | ||
min_max_dist, | ||
std::max( | ||
FixedPointCoordinate::ApproximateEuclideanDistance(location, upper_right), | ||
FixedPointCoordinate::ApproximateEuclideanDistance(location, lower_right))); | ||
|
||
min_max_dist = std::min( | ||
min_max_dist, | ||
std::max(FixedPointCoordinate::ApproximateEuclideanDistance(location, lower_right), | ||
FixedPointCoordinate::ApproximateEuclideanDistance(location, lower_left))); | ||
|
||
min_max_dist = std::min( | ||
min_max_dist, | ||
std::max(FixedPointCoordinate::ApproximateEuclideanDistance(location, lower_left), | ||
FixedPointCoordinate::ApproximateEuclideanDistance(location, upper_left))); | ||
return min_max_dist; | ||
} | ||
|
||
inline bool Contains(const FixedPointCoordinate &location) const | ||
{ | ||
const bool lats_contained = (location.lat >= min_lat) && (location.lat <= max_lat); | ||
const bool lons_contained = (location.lon >= min_lon) && (location.lon <= max_lon); | ||
return lats_contained && lons_contained; | ||
} | ||
|
||
inline friend std::ostream &operator<<(std::ostream &out, const RectangleInt2D &rect) | ||
{ | ||
out << rect.min_lat / COORDINATE_PRECISION << "," << rect.min_lon / COORDINATE_PRECISION | ||
<< " " << rect.max_lat / COORDINATE_PRECISION << "," | ||
<< rect.max_lon / COORDINATE_PRECISION; | ||
return out; | ||
} | ||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters