Skip to content

Instantly share code, notes, and snippets.

@unkray
Last active April 30, 2020 16:53
Show Gist options
  • Select an option

  • Save unkray/f949553aff6cb679a6252927efe537a3 to your computer and use it in GitHub Desktop.

Select an option

Save unkray/f949553aff6cb679a6252927efe537a3 to your computer and use it in GitHub Desktop.

Revisions

  1. unkray revised this gist Apr 30, 2020. 1 changed file with 8 additions and 4 deletions.
    12 changes: 8 additions & 4 deletions polygon.php
    Original file line number Diff line number Diff line change
    @@ -63,12 +63,16 @@ function pointOnVertex($point, $vertices) {
    }

    function pointStringToCoordinates($pointString) {
    if(is_array($pointString)) {
    $coordinates = $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 {
    $coordinates = explode(" ", $pointString);
    return ["x" => 0, "y" => 0];
    }
    return (!empty($coordinates))? ["x" => $coordinates[0], "y" => $coordinates[1]]: ["x" => 0, "y" => 0];
    }

    }
  2. unkray created this gist Apr 30, 2020.
    74 changes: 74 additions & 0 deletions polygon.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    <?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(is_array($pointString)) {
    $coordinates = $pointString;
    } else {
    $coordinates = explode(" ", $pointString);
    }
    return (!empty($coordinates))? ["x" => $coordinates[0], "y" => $coordinates[1]]: ["x" => 0, "y" => 0];
    }

    }