How can I determine whether a 2D Point is within a Polygon?

前端 未结 30 2677
醉梦人生
醉梦人生 2020-11-21 05:06

I\'m trying to create a fast 2D point inside polygon algorithm, for use in hit-testing (e.g. Polygon.contains(p:Point)). Suggestions for effective tech

30条回答
  •  半阙折子戏
    2020-11-21 05:53

    The Eric Haines article cited by bobobobo is really excellent. Particularly interesting are the tables comparing performance of the algorithms; the angle summation method is really bad compared to the others. Also interesting is that optimisations like using a lookup grid to further subdivide the polygon into "in" and "out" sectors can make the test incredibly fast even on polygons with > 1000 sides.

    Anyway, it's early days but my vote goes to the "crossings" method, which is pretty much what Mecki describes I think. However I found it most succintly described and codified by David Bourke. I love that there is no real trigonometry required, and it works for convex and concave, and it performs reasonably well as the number of sides increases.

    By the way, here's one of the performance tables from the Eric Haines' article for interest, testing on random polygons.

                           number of edges per polygon
                             3       4      10      100    1000
    MacMartin               2.9     3.2     5.9     50.6    485
    Crossings               3.1     3.4     6.8     60.0    624
    Triangle Fan+edge sort  1.1     1.8     6.5     77.6    787
    Triangle Fan            1.2     2.1     7.3     85.4    865
    Barycentric             2.1     3.8    13.8    160.7   1665
    Angle Summation        56.2    70.4   153.6   1403.8  14693
    
    Grid (100x100)          1.5     1.5     1.6      2.1      9.8
    Grid (20x20)            1.7     1.7     1.9      5.7     42.2
    Bins (100)              1.8     1.9     2.7     15.1    117
    Bins (20)               2.1     2.2     3.7     26.3    278
    

提交回复
热议问题