diff options
author | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2016-03-04 18:28:58 +0300 |
---|---|---|
committer | Sergey Yershov <yershov@corp.mail.ru> | 2016-03-23 16:52:56 +0300 |
commit | 23cba423c352702e39a43de3b1c4f1a52e315fae (patch) | |
tree | ad496511a959cb07bc3dfec1a77b63d46a03c802 /geometry | |
parent | 01835487d022ad6d589df0322c7b7a1f47177b46 (diff) |
Do not clip buildings triangles.
Diffstat (limited to 'geometry')
-rw-r--r-- | geometry/clipping.cpp | 84 |
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(); |