Last active
April 30, 2020 16:53
-
-
Save unkray/f949553aff6cb679a6252927efe537a3 to your computer and use it in GitHub Desktop.
Belonging to the point of the polygon / Принадлежность точки к полигону
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| class Polygon { | |
| var $pointOnVertex = true; // Check if the point sits exactly on one of the vertices? | |
| function pointLocation() { | |
| } | |
| function pointInPolygon($point, $polygon, $pointOnVertex = true) { | |
| if(empty($polygon)) { | |
| $polygon = $this->polygon; | |
| } | |
| $this->pointOnVertex = $pointOnVertex; | |
| // Transform string coordinates into arrays with x and y values | |
| $point = $this->pointStringToCoordinates($point); | |
| $vertices = array(); | |
| foreach ($polygon as $vertex) { | |
| $vertices[] = $this->pointStringToCoordinates($vertex); | |
| } | |
| // Check if the point sits exactly on a vertex | |
| if ($this->pointOnVertex == true and $this->pointOnVertex($point, $vertices) == true) { | |
| return "vertex"; | |
| } | |
| // Check if the point is inside the polygon or on the boundary | |
| $intersections = 0; | |
| $vertices_count = count($vertices); | |
| for ($i=1; $i < $vertices_count; $i++) { | |
| $vertex1 = $vertices[$i-1]; | |
| $vertex2 = $vertices[$i]; | |
| if ($vertex1['y'] == $vertex2['y'] and $vertex1['y'] == $point['y'] and $point['x'] > min($vertex1['x'], $vertex2['x']) and $point['x'] < max($vertex1['x'], $vertex2['x'])) { // Check if point is on an horizontal polygon boundary | |
| return "boundary"; | |
| } | |
| if ($point['y'] > min($vertex1['y'], $vertex2['y']) and $point['y'] <= max($vertex1['y'], $vertex2['y']) and $point['x'] <= max($vertex1['x'], $vertex2['x']) and $vertex1['y'] != $vertex2['y']) { | |
| $xinters = ($point['y'] - $vertex1['y']) * ($vertex2['x'] - $vertex1['x']) / ($vertex2['y'] - $vertex1['y']) + $vertex1['x']; | |
| if ($xinters == $point['x']) { // Check if point is on the polygon boundary (other than horizontal) | |
| return "boundary"; | |
| } | |
| if ($vertex1['x'] == $vertex2['x'] || $point['x'] <= $xinters) { | |
| $intersections++; | |
| } | |
| } | |
| } | |
| // If the number of edges we passed through is odd, then it's in the polygon. | |
| if ($intersections % 2 != 0) { | |
| return "inside"; | |
| } else { | |
| return "outside"; | |
| } | |
| } | |
| function pointOnVertex($point, $vertices) { | |
| foreach($vertices as $vertex) { | |
| if ($point == $vertex) { | |
| return true; | |
| } | |
| } | |
| } | |
| function pointStringToCoordinates($pointString) { | |
| if(!empty($pointString)) { | |
| if(is_array($pointString)) { | |
| $coordinates = $pointString; | |
| } else { | |
| $coordinates = explode(" ", $pointString); | |
| } | |
| return (!empty($coordinates))? ["x" => $coordinates[0], "y" => $coordinates[1]]: ["x" => 0, "y" => 0]; | |
| } else { | |
| return ["x" => 0, "y" => 0]; | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment