봄날은 갔다. 이제 그 정신으로 공부하자

[php] 다각형 영역내에 포인트가 포함되어 있는지 체크하는 함수 본문

카테고리 없음

[php] 다각형 영역내에 포인트가 포함되어 있는지 체크하는 함수

길재의 그 정신으로 공부하자 2025. 1. 10. 10:10

GPS 관련 처리를 하다보면 사용자가 선택한 포인트가 영역내에 포함되어 있는지 체크해 별도의 처리를 해주어야 하는 경우가 있는데 이를 지원해주는 함수는 아래와 같습니다.

 

function ptInPolygon($polygon, $point) {
    $p0 = end($polygon);
    $ctr = 0;
    foreach ( $polygon as $p1 ) {
    	// there is a bug with this algorithm, when a point in "on" a vertex
        // in that case just add an epsilon
        if ($point[1] == $p0[1])
        	$point[1]+=0.0000000001; #epsilon

        // ignore edges of constant latitude (yes, this is correct!)
        if ( $p0[1] != $p1[1] ) {
        	// scale latitude of $test_point so that $p0 maps to 0 and $p1 to 1:
            $interp = ($point[1] - $p0[1]) / ($p1[1] - $p0[1]);

            // does the edge intersect the latitude of $test_point?
            // (note: use >= and < to avoid double-counting exact endpoint hits)
            if ( $interp >= 0 && $interp < 1 ) {
            	// longitude of the edge at the latitude of the test point:
                // (could use fancy spherical interpolation here, but for small
                // regions linear interpolation should be fine)
                $long = $interp * $p1[0] + (1 - $interp) * $p0[0];
                // is the intersection east of the test point?
                if ( $long > $point[0] ) {
                	// if so, count it:
                    $ctr++;
                }
            }
        }
        $p0 = $p1;
    }
    return ($ctr & 1);
}
Comments