Visualization of Dan Sunday's winding number algorithm.
![arcmap count points in polygon arcmap count points in polygon](https://i.stack.imgur.com/CVVSH.png)
Since the result, the sum of all angles, can add up to 0 or 2 π ) only, it is sufficient to track through which quadrants the polygon winds, as it turns around the test point, which makes the winding number algorithm comparable in speed to counting the boundary crossings. Luckily, these inverse trigonometric functions do not need to be computed. However, this involves costly inverse trigonometric functions, which generally makes this algorithm performance-inefficient (slower) compared to the ray casting algorithm. One way to compute the winding number is to sum up the angles subtended by each side of the polygon. This algorithm is sometimes also known as the nonzero-rule algorithm. If the winding number is non-zero, the point lies inside the polygon. In other cases, when polygon sides are computed from other types of data, other tricks must be applied for the numerical robustness of the algorithm.Īnother technique used to check if a point is inside a polygon is to compute the given point's winding number with respect to the polygon.
![arcmap count points in polygon arcmap count points in polygon](https://i.stack.imgur.com/8XsFQ.png)
If the polygon is specified by its vertices, then this problem is eliminated by checking the y-coordinates of the ray and the ends of the tested polygon side before actual computation of the intersection. Once again, the case of the ray passing through a vertex may pose numerical problems in finite precision arithmetics: for two sides adjacent to the same vertex the straightforward computation of the intersection with a ray may not give the vertex in both cases. This is effectively equivalent to considering vertices on the ray as lying slightly above the ray. The issue is solved as follows: If the intersection point is a vertex of a tested polygon side, then the intersection counts only if the second vertex of the side lies below the ray.
![arcmap count points in polygon arcmap count points in polygon](https://i.ytimg.com/vi/v3U3DJ2JZXg/maxresdefault.jpg)
A similar problem arises with horizontal segments that happen to fall on the ray. While it is OK for the case of the topmost vertex in the example or the vertex between crossing 4 and 5, the case of the rightmost vertex (in the example) requires that we count one intersection for the algorithm to work correctly. If the ray passes exactly through a vertex of a polygon, then it will intersect 2 segments at their endpoints. In this case the following problem must be addressed. Most implementations of the ray casting algorithm consecutively check intersections of a ray with all sides of the polygon in turn. However, for a formally correct computer program, one would have to introduce a numerical tolerance ε and test in line whether P (the point) lies within ε of L (the Line), in which case the algorithm should stop and report " P lies very close to the boundary." This is not normally a concern, as speed is much more important than complete accuracy in most applications of computer graphics. If implemented on a computer with finite precision arithmetics, the results may be incorrect if the point lies very close to that boundary, because of rounding errors. This observation may be mathematically proved using the Jordan curve theorem. As a result, after every two "border crossings" the moving point goes outside. The algorithm is based on a simple observation that if a point moves along a ray from infinity to the probe point and if it crosses the boundary of a polygon, possibly several times, then it alternately goes from the outside to inside, then from the inside to the outside, etc. This algorithm is sometimes also known as the crossing number algorithm or the even–odd rule algorithm, and was known as early as 1962. The status of a point on the edge of the polygon depends on the details of the ray intersection algorithm. If the point is on the inside of the polygon then it will intersect the edge an odd number of times. If the point is on the outside of the polygon the ray will intersect its edge an even number of times. One simple way of finding whether the point is inside or outside a simple polygon is to test how many times a ray, starting from the point and going in any fixed direction, intersects the edges of the polygon. If it is even, the point lies outside the polygon this test also works in three dimensions. The number of intersections for a ray passing from the exterior of the polygon to any point if odd, it shows that the point lies inside the polygon.