tags:

views:

74

answers:

4

Hi,

I'm getting a "Parse error: syntax error, unexpected '{' in line 2". And I don't see the problem.

<?php
class pointLocation {
    var $pointOnVertex = true; // Check if the point sits exactly on one of the vertices

    function pointLocation() {
    }
    
    
        function pointInPolygon($point, $polygon, $pointOnVertex = true) {
        $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 even, 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) {
        $coordinates = explode(" ", $pointString);
        return array("x" => $coordinates[0], "y" => $coordinates[1]);
    }
    
    
}



$pointLocation = new pointLocation();
$points = array("30 19", "0 0", "10 0", "30 20", "11 0", "0 11", "0 10", "30 22", "20 20");
$polygon = array("10 0", "20 0", "30 10", "30 20", "20 30", "10 30", "0 20", "0 10", "10 0");
foreach($points as $key => $point) {
    echo "$key ($point) is " . $pointLocation->pointInPolygon($point, $polygon) . "<br>";
}
?>

Does anyone see the problem?

Thanks,

-Laxmidi

+3  A: 

Tested it. Runs without errors and produces the following outout:

0 (30 19) is boundary<br>1 (0 0) is outside<br>2 (10 0) is vertex<br>3 (30 20) is vertex<br>4 (11 0) is boundary<br>5 (0 11) is boundary<br>6 (0 10) is vertex<br>7 (30 22) is outside<br>8 (20 20) is inside<br>

(Mac OS x 10.6.3, PHP 5.3.1 cli)

EDIT: Maybe there cause for your error lies in some other part of your script that calls your class definition via include/require.

More info may help.

Techpriester
Tested on CentOS running PHP 5.3.1, I get identical output.
Zack
The author is having a problem; telling him that the problem he's experiencing doesn't exist doesn't help matters.
mattbasta
@mattbasta: Actually it does. By demonstrating that it works, we can assure him, that the code he has posted is not the cause of the problem.
Techpriester
Hi, I'm running it on my localhost which is a Mac.-Laxmidi
Laxmidi
Zach, Techpriester, and matbasta are all correct. I'm glad that the code works. But, I'm still stuck with my problem.
Laxmidi
A: 

Works fine on my end, so it sounds like an encoding or EOL problem. Try these things:

  • Make sure your file is in UNIX EOL format. Each line should end with a line feed (LF)
  • Make sure you don't have a BOM (byte order mark) in your files.
  • You can try getting rid of the ?> at the end of your file. It serves no purpose. Granted, this won't really help to solve your problem, but it will make your code a little cleaner.
  • Try adding a line break after your opening <?php and after your class pointLocation {. Some versions of PHP trip up on weird whitespace.
  • Make sure your file is in something standard, like UTF-8

A good editor to make sure your file meets these criteria is Notepad++. There are lots of options and they make it dead easy. Don't use plain old Notepad, because Microsoft locks you into CRLF format (not PHP-friendly) and doesn't give you control over encoding.

Good luck!

mattbasta
Hi mattbasta,Thank you for the suggestions. It sounds like the code works for everyone else. I used Dreamweaver to edit the code. How do I check the UNIX EOL format?-Laxmidi
Laxmidi
A: 

Tested like Techpriester, runs without errors and produces the following output:

0 (30 19) is boundary<br>1 (0 0) is outside<br>2 (10 0) is vertex<br>3 (30 20) is vertex<br>4 (11 0) is boundary<br>5 (0 11) is boundary<br>6 (0 10) is vertex<br>7 (30 22) is outside<br>8 (20 20) is inside<br>

Tested on Ubuntu 9.10, Linux 2.6.31-17, PHP 5.3.2-0.dotdeb.2 (cli)

Try checking your php.ini for any auto-prepended files (auto_prepend_file) that may have that error.

Leafy
Also, will be a good idea to check for previous includes (if they are present) in this same files.
Rigo Vides
A: 

Hi,

As the code worked for everyone else, I tried copying and pasting the code from Stackoverflow back into my system and it worked. Weird. I must have had something screwed up with the formatting.

I still don't know what the problem was, but at least it works.

Thank you mattbasta, Techpriester, and Zack.

Laxmidi