Robert Muir created LUCENE-7222:
-----------------------------------

             Summary: Improve Polygon.contains()
                 Key: LUCENE-7222
                 URL: https://issues.apache.org/jira/browse/LUCENE-7222
             Project: Lucene - Core
          Issue Type: Bug
            Reporter: Robert Muir


The current PIP algorithm could use some improvements. I think we should swap 
in the algorithm here: 
https://www.ecse.rpi.edu/~wrf/Research/Short_Notes/pnpoly.html

It is a bit faster for complex polygons:
{noformat}
n=50   
19.3 QPS -> 20.4 QPS
n=500   
9.8 QPS -> 11.2 QPS
n=1000 
6.3 QPS -> 7.4 QPS
{noformat}

It also has some nice properties:
{quote}
 if you partition a region of the plane into polygons, i.e., form a planar 
graph, then PNPOLY will locate each point into exactly one polygon. In other 
words, PNPOLY considers each polygon to be topologically a semi-open set. This 
makes things simpler, i.e., causes fewer special cases, if you use PNPOLY as 
part of a larger system. Examples of this include locating a point in a planar 
graph, and intersecting two planar graphs. 
{quote}

You can see the current issues here by writing tests that pick numbers that 
won't suffer from rounding errors, to see how the edges behave. For a rectangle 
as an example, the current code will treat all edges and corners as 
"contains=true", except for the top edge. This means that if you tried to e.g. 
form a grid of rectangles (like described above), some points would exist in 
more than one square.

On the other hand if you port this same test to java.awt.Polygon, you will see 
that only the bottom left corner, bottom side, and left side are treated as 
"contains=true". So then your grid would work without any corner cases. This 
algorithm behaves the same way.

Finally, it supports multiple components and holes directly. this is nice for 
the future because for a complex multipolygon, we can just have one tight loop.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to