121 return (isCounterClockwise<IT, VT>(l1Start, l2Start, l2End) != isCounterClockwise<IT, VT>(l1End, l2Start, l2End)
122 && isCounterClockwise<IT, VT>(l1Start, l1End, l2Start) != isCounterClockwise<IT, VT>(l1Start, l1End, l2End)
124 || isPointOnLeftOfEdge<IT, VT>(l1Start, l2Start, l2End) == 0
125 || isPointOnLeftOfEdge<IT, VT>(l1End, l2Start, l2End) == 0;
151 const VT& rectCornerA,
152 const VT& rectCornerB,
153 const VT& rectCornerC,
154 const VT& rectCornerD
156 return lineIntersectsLineInclusive<IT, VT>(
158 rectCornerA, rectCornerB
159 ) || lineIntersectsLineInclusive<IT, VT>(
161 rectCornerB, rectCornerC
162 ) || lineIntersectsLineInclusive<IT, VT>(
164 rectCornerC, rectCornerD
165 ) || lineIntersectsLineInclusive<IT, VT>(
167 rectCornerD, rectCornerA
189 const VT& rectCornerA,
190 const VT& rectCornerB,
191 const VT& rectCornerC,
192 const VT& rectCornerD
195 isPointOnLeftOfEdge<IT, VT>(
196 point, rectCornerA, rectCornerB
198 && isPointOnLeftOfEdge<IT, VT>(
199 point, rectCornerB, rectCornerC
201 && isPointOnLeftOfEdge<IT, VT>(
202 point, rectCornerC, rectCornerD
204 && isPointOnLeftOfEdge<IT, VT>(
205 point, rectCornerD, rectCornerA
228 const VT& rectCornerA,
229 const VT& rectCornerB,
230 const VT& rectCornerC,
231 const VT& rectCornerD
234 isPointOnLeftOfEdge<IT, VT>(
235 point, rectCornerA, rectCornerB
237 && isPointOnLeftOfEdge<IT, VT>(
238 point, rectCornerB, rectCornerC
240 && isPointOnLeftOfEdge<IT, VT>(
241 point, rectCornerC, rectCornerD
243 && isPointOnLeftOfEdge<IT, VT>(
244 point, rectCornerD, rectCornerA
259 const VT& startPosition,
260 const VT& endPosition
262 auto right = std::max(startPosition.x, endPosition.x);
263 auto left = std::min(startPosition.x, endPosition.x);
264 auto bottom = std::min(startPosition.y, endPosition.y);
265 auto top = std::max(startPosition.y, endPosition.y);
267 return left <= point.x && point.x <= right
268 && bottom <= point.y && point.y <= top;
285 auto right = std::max(rectStart.x, rectEnd.x);
286 auto left = std::min(rectStart.x, rectEnd.x);
287 auto bottom = std::min(rectStart.y, rectEnd.y);
288 auto top = std::max(rectStart.y, rectEnd.y);
290 if (lineStart.x == lineEnd.x) {
292 if (lineStart.x > right || lineStart.x < left) {
296 auto minY = std::min(lineStart.y, lineEnd.y);
297 auto maxY = std::max(lineStart.y, lineEnd.y);
300 (minY > top && maxY > top)
301 || (minY < bottom && maxY < bottom)
306 }
else if (lineStart.y == lineEnd.y) {
308 if (lineStart.y > top || lineStart.y < bottom) {
312 auto minX = std::min(lineStart.x, lineEnd.x);
313 auto maxX = std::max(lineStart.x, lineEnd.x);
316 (minX > right && maxX > right)
317 || (minX < left && maxX < left)
323 throw std::runtime_error(
"Diagonal lines are not yet implemented");
341 auto right = std::max(rectStart.x, rectEnd.x);
342 auto left = std::min(rectStart.x, rectEnd.x);
343 auto bottom = std::min(rectStart.y, rectEnd.y);
344 auto top = std::max(rectStart.y, rectEnd.y);
346 if (lineStart.x == lineEnd.x) {
348 if (lineStart.x >= right || lineStart.x <= left) {
352 auto minY = std::min(lineStart.y, lineEnd.y);
353 auto maxY = std::max(lineStart.y, lineEnd.y);
356 (minY >= top && maxY >= top)
357 || (minY <= bottom && maxY <= bottom)
362 }
else if (lineStart.y == lineEnd.y) {
364 if (lineStart.y >= top || lineStart.y <= bottom) {
368 auto minX = std::min(lineStart.x, lineEnd.x);
369 auto maxX = std::max(lineStart.x, lineEnd.x);
372 (minX >= right && maxX >= right)
373 || (minX <= left && maxX <= left)
379 throw std::runtime_error(
"Diagonal lines are not yet implemented");