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:
authorDaria Volvenkova <d.volvenkova@corp.mail.ru>2016-03-04 18:28:58 +0300
committerSergey Yershov <yershov@corp.mail.ru>2016-03-23 16:52:56 +0300
commit23cba423c352702e39a43de3b1c4f1a52e315fae (patch)
treead496511a959cb07bc3dfec1a77b63d46a03c802 /geometry
parent01835487d022ad6d589df0322c7b7a1f47177b46 (diff)
Do not clip buildings triangles.
Diffstat (limited to 'geometry')
-rw-r--r--geometry/clipping.cpp84
1 files changed, 42 insertions, 42 deletions
diff --git a/geometry/clipping.cpp b/geometry/clipping.cpp
index d64cd27069..f400511da7 100644
--- a/geometry/clipping.cpp
+++ b/geometry/clipping.cpp
@@ -7,10 +7,42 @@ namespace m2
{
using AddPoligonPoint = function<void(m2::PointD const &)>;
-using InsertCorners = function<void(int, int)>;
-bool IntersectEdge(m2::RectD const & rect, m2::PointD const & pp1, m2::PointD const & pp2,
- InsertCorners const & insertCorners, AddPoligonPoint const & addPoligonPoint,
+int GetRectSideIndex(int code)
+{
+ if (code == m2::detail::LEFT)
+ return 0;
+ if (code == m2::detail::TOP)
+ return 1;
+ if (code == m2::detail::RIGHT)
+ return 2;
+ return 3;
+}
+
+void InsertCorners(vector<m2::PointD> const & corners,
+ m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3,
+ AddPoligonPoint const & addPoligonPoint, int code1, int code2)
+{
+ int cornerInd = GetRectSideIndex(code1);
+ int endCornerInd = GetRectSideIndex(code2);
+
+ if (!IsPointInsideTriangle(corners[cornerInd], p1, p2, p3))
+ {
+ if (!IsPointInsideTriangle(corners[endCornerInd], p1, p2, p3))
+ return;
+ swap(cornerInd, endCornerInd);
+ }
+
+ while (cornerInd != endCornerInd)
+ {
+ addPoligonPoint(corners[cornerInd]);
+ cornerInd = (cornerInd + 1) % 4;
+ }
+}
+
+bool IntersectEdge(m2::RectD const & rect, vector<m2::PointD> const & corners,
+ m2::PointD const & pp1, m2::PointD const & pp2, m2::PointD const & pp3,
+ AddPoligonPoint const & addPoligonPoint,
int prevClipCode, int nextClipCode, int & firstClipCode, int & lastClipCode)
{
m2::PointD p1 = pp1;
@@ -19,35 +51,24 @@ bool IntersectEdge(m2::RectD const & rect, m2::PointD const & pp1, m2::PointD co
if (m2::Intersect(rect, p1, p2, firstClipCode, lastClipCode))
{
if (firstClipCode != 0 && prevClipCode != 0 && ((firstClipCode & prevClipCode) == 0))
- insertCorners(prevClipCode, firstClipCode);
+ InsertCorners(corners, pp1, pp2, pp3, addPoligonPoint, prevClipCode, firstClipCode);
addPoligonPoint(p1);
addPoligonPoint(p2);
if (lastClipCode != 0 && nextClipCode != 0 && ((lastClipCode & nextClipCode) == 0) &&
firstClipCode != lastClipCode && prevClipCode != nextClipCode)
- insertCorners(lastClipCode, nextClipCode);
+ InsertCorners(corners, pp1, pp2, pp3, addPoligonPoint, lastClipCode, nextClipCode);
return true;
}
else if (prevClipCode != 0 && nextClipCode != 0)
{
- insertCorners(prevClipCode, nextClipCode);
+ InsertCorners(corners, pp1, pp2, pp3, addPoligonPoint, prevClipCode, nextClipCode);
}
return false;
}
-int GetRectSideIndex(int code)
-{
- if (code == m2::detail::LEFT)
- return 0;
- if (code == m2::detail::TOP)
- return 1;
- if (code == m2::detail::RIGHT)
- return 2;
- return 3;
-}
-
void ClipTriangleByRect(m2::RectD const & rect, m2::PointD const & p1,
m2::PointD const & p2, m2::PointD const & p3,
ClipTriangleByRectResultIt const & resultIterator)
@@ -61,11 +82,8 @@ void ClipTriangleByRect(m2::RectD const & rect, m2::PointD const & p1,
return;
}
- const int kAveragePoligonSize = 3;
const double kEps = 1e-8;
-
vector<m2::PointD> poligon;
- poligon.reserve(kAveragePoligonSize);
auto const addPoligonPoint = [&poligon, kEps](m2::PointD const & pt)
{
if (poligon.empty() || !poligon.back().EqualDxDy(pt, kEps))
@@ -73,36 +91,18 @@ void ClipTriangleByRect(m2::RectD const & rect, m2::PointD const & p1,
};
vector<m2::PointD> const corners = { rect.LeftTop(), rect.RightTop(), rect.RightBottom(), rect.LeftBottom() };
- auto const insertCorners = [&corners, rect, p1, p2, p3, addPoligonPoint](int code1, int code2)
- {
- int cornerInd = GetRectSideIndex(code1);
- int endCornerInd = GetRectSideIndex(code2);
-
- if (!IsPointInsideTriangle(corners[cornerInd], p1, p2, p3))
- {
- if (!IsPointInsideTriangle(corners[endCornerInd], p1, p2, p3))
- return;
- swap(cornerInd, endCornerInd);
- }
-
- while (cornerInd != endCornerInd)
- {
- addPoligonPoint(corners[cornerInd]);
- cornerInd = (cornerInd + 1) % 4;
- }
- };
int firstClipCode[3];
int lastClipCode[3];
bool intersected[3];
- intersected[0] = IntersectEdge(rect, p1, p2, insertCorners, addPoligonPoint,
+ intersected[0] = IntersectEdge(rect, corners, p1, p2, p3, addPoligonPoint,
0, 0, firstClipCode[0], lastClipCode[0]);
- intersected[1] = IntersectEdge(rect, p2, p3, insertCorners, addPoligonPoint,
+ intersected[1] = IntersectEdge(rect, corners, p2, p3, p1, addPoligonPoint,
lastClipCode[0], 0, firstClipCode[1], lastClipCode[1]);
- intersected[2] = IntersectEdge(rect, p3, p1, insertCorners, addPoligonPoint,
+ intersected[2] = IntersectEdge(rect, corners, p3, p1, p2, addPoligonPoint,
lastClipCode[1] != 0 ? lastClipCode[1] : lastClipCode[0],
firstClipCode[0] != 0 ? firstClipCode[0] : firstClipCode[1],
firstClipCode[2], lastClipCode[2]);
@@ -119,7 +119,7 @@ void ClipTriangleByRect(m2::RectD const & rect, m2::PointD const & p1,
}
if (intersectCount == 1 && intersected[2])
- insertCorners(lastClipCode[2], firstClipCode[2]);
+ InsertCorners(corners, p1, p2, p3, addPoligonPoint, lastClipCode[2], firstClipCode[2]);
if (!poligon.empty() && poligon.back().EqualDxDy(poligon[0], kEps))
poligon.pop_back();