MCPcopy Create free account
hub / github.com/comaps/comaps / ClipTriangleByRect

Function ClipTriangleByRect

libs/geometry/clipping.cpp:79–133  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

77} // namespace
78
79void ClipTriangleByRect(m2::RectD const & rect, m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3,
80 ClipTriangleByRectResultIt const & resultIterator)
81{
82 if (rect.IsPointInside(p1) && rect.IsPointInside(p2) && rect.IsPointInside(p3))
83 {
84 resultIterator(p1, p2, p3);
85 return;
86 }
87
88 static constexpr double kEps = 1e-8;
89 std::vector<m2::PointD> polygon;
90 auto const addPolygonPoint = [&polygon](m2::PointD const & pt)
91 {
92 if (polygon.empty() || !polygon.back().EqualDxDy(pt, kEps))
93 polygon.push_back(pt);
94 };
95
96 CornersT const corners = {rect.LeftTop(), rect.RightTop(), rect.RightBottom(), rect.LeftBottom()};
97
98 int firstClipCode[3];
99 int lastClipCode[3];
100 bool intersected[3];
101
102 intersected[0] = IntersectEdge(rect, corners, p1, p2, p3, addPolygonPoint, 0, 0, firstClipCode[0], lastClipCode[0]);
103
104 intersected[1] =
105 IntersectEdge(rect, corners, p2, p3, p1, addPolygonPoint, lastClipCode[0], 0, firstClipCode[1], lastClipCode[1]);
106
107 intersected[2] = IntersectEdge(
108 rect, corners, p3, p1, p2, addPolygonPoint, lastClipCode[1] != 0 ? lastClipCode[1] : lastClipCode[0],
109 firstClipCode[0] != 0 ? firstClipCode[0] : firstClipCode[1], firstClipCode[2], lastClipCode[2]);
110
111 int const intersectCount = intersected[0] + intersected[1] + intersected[2];
112 if (intersectCount == 0)
113 {
114 if (IsPointInsideTriangle(rect.Center(), p1, p2, p3))
115 {
116 resultIterator(rect.LeftTop(), rect.RightTop(), rect.RightBottom());
117 resultIterator(rect.RightBottom(), rect.LeftBottom(), rect.LeftTop());
118 }
119 return;
120 }
121
122 if (intersectCount == 1 && intersected[2])
123 InsertCorners(corners, p1, p2, p3, addPolygonPoint, lastClipCode[2], firstClipCode[2]);
124
125 if (!polygon.empty() && polygon.back().EqualDxDy(polygon[0], kEps))
126 polygon.pop_back();
127
128 if (polygon.size() < 3)
129 return;
130
131 for (size_t i = 0; i < polygon.size() - 2; ++i)
132 resultIterator(polygon[0], polygon[i + 1], polygon[i + 2]);
133}
134
135template <class FnT>
136void ClipPathByRectImpl(m2::RectD const & rect, std::vector<m2::PointD> const & path, FnT && fn)

Callers 2

UNIT_TESTFunction · 0.85
operator()Method · 0.85

Calls 15

IntersectEdgeFunction · 0.85
IsPointInsideTriangleFunction · 0.85
InsertCornersFunction · 0.85
backMethod · 0.80
LeftTopMethod · 0.80
RightTopMethod · 0.80
RightBottomMethod · 0.80
LeftBottomMethod · 0.80
IsPointInsideMethod · 0.45
emptyMethod · 0.45
EqualDxDyMethod · 0.45
push_backMethod · 0.45

Tested by 1

UNIT_TESTFunction · 0.68