[core] Add CollisionIndex::featureIntersectsTileBorders()

This commit is contained in:
Mikhail Pozdnyakov
2019-12-04 10:39:56 +02:00
parent 2125548a6e
commit 07194f7fa5
2 changed files with 33 additions and 4 deletions

View File

@@ -81,13 +81,35 @@ CollisionTileBoundaries CollisionIndex::projectTileBoundaries(const mat4& posMat
}
bool CollisionIndex::isInsideTile(float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const {
// This check is only well defined when the tile boundaries are axis-aligned
// We are relying on it only being used in MapMode::Tile, where that is always the case
// The tile border checks below are only well defined when the tile boundaries are axis-aligned
// We are relying on it only being used in MapMode::Tile, where that is always the case
inline bool CollisionIndex::isInsideTile(
float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const {
return x1 >= tileBoundaries[0] && y1 >= tileBoundaries[1] && x2 < tileBoundaries[2] && y2 < tileBoundaries[3];
}
inline bool CollisionIndex::intersectsTileBorders(
float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const {
return x1 < tileBoundaries[2] && x2 > tileBoundaries[0] && y1 < tileBoundaries[3] && y2 > tileBoundaries[1];
}
bool CollisionIndex::featureIntersectsTileBorders(const CollisionFeature& feature,
Point<float> shift,
const mat4& posMatrix,
const float textPixelRatio,
const CollisionTileBoundaries& tileEdges) const {
assert(!feature.alongLine);
assert(!feature.boxes.empty());
const CollisionBox& box = feature.boxes.front();
const auto projectedPoint = projectAndGetPerspectiveRatio(posMatrix, box.anchor);
const float tileToViewport = textPixelRatio * projectedPoint.second;
float px1 = (box.x1 + shift.x) * tileToViewport + projectedPoint.first.x;
float py1 = (box.y1 + shift.y) * tileToViewport + projectedPoint.first.y;
float px2 = (box.x2 + shift.x) * tileToViewport + projectedPoint.first.x;
float py2 = (box.y2 + shift.y) * tileToViewport + projectedPoint.first.y;
return !intersectsTileBorders(px1, py1, px2, py2, tileEdges);
}
std::pair<bool,bool> CollisionIndex::placeFeature(const CollisionFeature& feature,
Point<float> shift,

View File

@@ -21,6 +21,11 @@ public:
using CollisionGrid = GridIndex<IndexedSubfeature>;
explicit CollisionIndex(const TransformState&, MapMode&);
bool featureIntersectsTileBorders(const CollisionFeature& feature,
Point<float> shift,
const mat4& posMatrix,
const float textPixelRatio,
const CollisionTileBoundaries& tileEdges) const;
std::pair<bool,bool> placeFeature(const CollisionFeature& feature,
Point<float> shift,
@@ -49,6 +54,8 @@ private:
bool isOffscreen(float x1, float y1, float x2, float y2) const;
bool isInsideGrid(float x1, float y1, float x2, float y2) const;
bool isInsideTile(float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const;
bool intersectsTileBorders(
float x1, float y1, float x2, float y2, const CollisionTileBoundaries& tileBoundaries) const;
std::pair<bool,bool> placeLineFeature(const CollisionFeature& feature,
const mat4& posMatrix,