From 31fd4ba7516fc5ec6adec8d095e9b09050ebd74e Mon Sep 17 00:00:00 2001 From: JaffaKetchup Date: Thu, 12 Sep 2024 18:15:37 +0100 Subject: [PATCH 1/2] Added polygon validity (has more than 2 points) check before hit testing --- lib/src/layer/polygon_layer/painter.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/src/layer/polygon_layer/painter.dart b/lib/src/layer/polygon_layer/painter.dart index 878bea4ea..9847895ec 100644 --- a/lib/src/layer/polygon_layer/painter.dart +++ b/lib/src/layer/polygon_layer/painter.dart @@ -68,7 +68,9 @@ base class _PolygonPainter if (projectedCoords.first != projectedCoords.last) { projectedCoords.add(projectedCoords.first); } - final isInPolygon = isPointInPolygon(point, projectedCoords); + final isValidPolygon = projectedCoords.length >= 3; + final isInPolygon = + isValidPolygon && isPointInPolygon(point, projectedCoords); final hasHoles = projectedPolygon.holePoints.isNotEmpty; final isInHole = hasHoles && @@ -84,7 +86,9 @@ base class _PolygonPainter projectedHoleCoords.add(projectedHoleCoords.first); } - if (isPointInPolygon(point, projectedHoleCoords)) { + final isValidHolePolygon = projectedHoleCoords.length >= 3; + if (isValidHolePolygon && + isPointInPolygon(point, projectedHoleCoords)) { return true; } } From b15c0741bf26220a7c20cb3219fd96b7475e0a90 Mon Sep 17 00:00:00 2001 From: JaffaKetchup Date: Thu, 12 Sep 2024 18:18:31 +0100 Subject: [PATCH 2/2] Minor improvement to remove anonymous function instant invocation pattern by using `any` method on list --- lib/src/layer/polygon_layer/painter.dart | 38 ++++++++++-------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/lib/src/layer/polygon_layer/painter.dart b/lib/src/layer/polygon_layer/painter.dart index 9847895ec..44aff4b8b 100644 --- a/lib/src/layer/polygon_layer/painter.dart +++ b/lib/src/layer/polygon_layer/painter.dart @@ -64,36 +64,30 @@ base class _PolygonPainter origin: hitTestCameraOrigin, points: projectedPolygon.points, ); - if (projectedCoords.first != projectedCoords.last) { projectedCoords.add(projectedCoords.first); } + final isValidPolygon = projectedCoords.length >= 3; final isInPolygon = isValidPolygon && isPointInPolygon(point, projectedCoords); - final hasHoles = projectedPolygon.holePoints.isNotEmpty; - final isInHole = hasHoles && - () { - for (final points in projectedPolygon.holePoints) { - final projectedHoleCoords = getOffsetsXY( - camera: camera, - origin: hitTestCameraOrigin, - points: points, - ); - - if (projectedHoleCoords.first != projectedHoleCoords.last) { - projectedHoleCoords.add(projectedHoleCoords.first); - } + final isInHole = projectedPolygon.holePoints.any( + (points) { + final projectedHoleCoords = getOffsetsXY( + camera: camera, + origin: hitTestCameraOrigin, + points: points, + ); + if (projectedHoleCoords.first != projectedHoleCoords.last) { + projectedHoleCoords.add(projectedHoleCoords.first); + } - final isValidHolePolygon = projectedHoleCoords.length >= 3; - if (isValidHolePolygon && - isPointInPolygon(point, projectedHoleCoords)) { - return true; - } - } - return false; - }(); + final isValidHolePolygon = projectedHoleCoords.length >= 3; + return isValidHolePolygon && + isPointInPolygon(point, projectedHoleCoords); + }, + ); // Second check handles case where polygon outline intersects a hole, // ensuring that the hit matches with the visual representation