최근 지도기반으로 작업하는 프로젝트가 있었다.
그 중에 지도에 폴리곤을 뿌려주고 클릭시, 마커 표시시 폴리곤 내부에 있는지 판단해야 하는 문제가 있었는데 그 과정에서 어떻게 했는지 간단하게 남겨보고 싶다.
특정 좌표 point와 polygon 이라는 변수로 각각 두었을 때 폴리곤 내부에 있는지 판단하는 코드는 아래와 같다.
function pointInPolygon(point, polygon) {
var x = point[0], y = point[1];
var inside = false;
for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
var xi = polygon[i][0], yi = polygon[i][1];
var xj = polygon[j][0], yj = polygon[j][1];
var intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
}
그리고 이제 사용을 하려면 아래와 같이 하면 된다
var polygon = [[123.23, 35.87], [125.21, 36.87], ...];
var point = [123.12, 35.21];
if (pointInPolygon(point, polygon)) {
console.log("Point is inside the polygon.");
} else {
console.log("Point is outside the polygon.");
}
위 코드에서는 레이캐스팅 알고리즘을 사용해서 폴리곤 내부에 점이 있는지 확인하는 내용이다.