In computational geometry, the visibility polygon or visibility region for a point p in the plane among obstacles is the possibly unbounded polygonal region of all points of the plane visible from p. The visibility polygon can also be defined for visibility from a segment, or a polygon. Visibility polygons are useful in robotics, video games, and in various optimization problems such as the facility location problem and the art gallery problem.

Visibility polygon shown in yellow. Four obstacles are shown in blue.

If the visibility polygon is bounded then it is a star-shaped polygon. A visibility polygon is bounded if all rays shooting from the point eventually terminate in some obstacle. This is the case, e.g., if the obstacles are the edges of a simple polygon and p is inside the polygon. In the latter case the visibility polygon may be found in linear time.[1][2][3][4]

Definitions edit

Formally, we can define the planar visibility polygon problem as such. Let   be a set of obstacles (either segments, or polygons) in  . Let   be a point in   that is not within an obstacle. Then, the point visibility polygon   is the set of points in  , such that for every point   in  , the segment   does not intersect any obstacle in  .

Likewise, the segment visibility polygon or edge visibility polygon is the portion visible to any point along a line segment.

Applications edit

Visibility polygons are useful in robotics. For example, in robot localization, a robot using sensors such as a lidar will detect obstacles that it can see, which is similar to a visibility polygon.[5]

They are also useful in video games, with numerous online tutorials explaining simple algorithms for implementing it.[6][7][8]

Algorithms for point visibility polygons edit

Numerous algorithms have been proposed for computing the point visibility polygon. For different variants of the problem (e.g. different types of obstacles), algorithms vary in time complexity.

Naive algorithms edit

Naive algorithms are easy to understand and implement, but they are not optimal, since they can be much slower than other algorithms.

Uniform ray casting "physical" algorithm edit

In real life, a glowing point illuminates the region visible to it because it emits light in every direction. This can be simulated by shooting rays in many directions. Suppose that the point is   and the set of obstacles is  . Then, the pseudocode may be expressed in the following way:

algorithm naive_bad_algorithm( ,  ) is
      :=  
    for  :
        // shoot a ray with angle  
          :=  
        for each obstacle in  :
              := min( , distance from   to the obstacle in this direction)
        add vertex   to  
    return  

Now, if it were possible to try all the infinitely many angles, the result would be correct. Unfortunately, it is impossible to really try every single direction due to the limitations of computers. An approximation can be created by casting many, say, 50 rays spaced uniformly apart. However, this is not an exact solution, since small obstacles might be missed by two adjacent rays entirely. Furthermore, it is very slow, since one may have to shoot many rays to gain a roughly similar solution, and the output visibility polygon may have many more vertices in it than necessary.

Ray casting to every vertex edit

The previously described algorithm can be significantly improved in both speed and correctness by making the observation that it suffices to only shoot rays to every obstacle's vertices. This is because any bends or corners along the boundary of a visibility polygon must be due to some corner (i.e. a vertex) in an obstacle.

algorithm naive_better_algorithm( ,  ) is
      :=  
    for each obstacle   in  :
        for each vertex   of  :
            // shoot a ray from   to  
              := distance from   to  
              := angle of   with respect to  
            for each obstacle   in  :
                  := min( , distance from   to  )
            add vertex   to  
    return  

The above algorithm may not be correct. See the discussion under Talk.

The time complexity of this algorithm is  . This is because the algorithm shoots a ray to every one of the   vertices, and to check where the ray ends, it has to check for intersection with every one of the   obstacles. This is sufficient for many simple applications such as video games, and as such many online tutorials teach this method.[8] However, as we shall see later, there are faster   algorithms (or even faster ones if the obstacle is a simple polygon or if there are a fixed number of polygonal holes).

Optimal algorithms for a point in a simple polygon edit

 
A visibility polygon for a point in the center (shown in white) inside a simple polygon, outlined in black.

Given a simple polygon   and a point  , a linear time algorithm is optimal for computing the region in   that is visible from  . Such an algorithm was first proposed in 1981.[2] However, it is quite complicated. In 1983, a conceptually simpler algorithm was proposed,[3] which had a minor error that was corrected in 1987.[4]

The latter algorithm will be briefly explained here. It simply walks around the boundary of the polygon  , processing the vertices in the order in which they appear, while maintaining a stack of vertices   where   is the top of the stack. The stack constitutes the vertices encountered so far which are visible to  . If, later during the execution of the algorithm, some new vertices are encountered that obscure part of  , then the obscured vertices in   will be popped from the stack. By the time the algorithm terminates,   will consist of all the visible vertices, i.e. the desired visibility polygon. An efficient implementation was published in 2014.[9]

Optimal algorithms for a point in a polygon with holes edit

For a point in a polygon with   holes and   vertices in total, it can be shown that in the worst case, a   algorithm is optimal. Such an algorithm was proposed in 1995 together with its proof of optimality.[10] However, it relies on the linear time polygon triangulation algorithm by Chazelle, which is extremely complex.

Optimal algorithms for a point among segments edit

Segments that do not intersect except at their endpoints edit

 
A visibility polygon for a point in the center (shown in white) amongst a set of arbitrary line segments in the plane, allowed to intersect only at their endpoints, acting as obstacles (shown in black).

For a point among a set of   segments that do not intersect except at their endpoints, it can be shown that in the worst case, a   algorithm is optimal. This is because a visibility polygon algorithm must output the vertices of the visibility polygon in sorted order, hence the problem of sorting can be reduced to computing a visibility polygon.[11]

Notice that any algorithm that computes a visibility polygon for a point among segments can be used to compute a visibility polygon for all other kinds of polygonal obstacles, since any polygon can be decomposed into segments.

Divide and conquer edit

A divide-and-conquer algorithm to compute the visibility polygon was proposed in 1987.[12]

Angular sweep edit

An angular sweep, i.e. rotational plane sweep algorithm to compute the visibility polygon was proposed in 1985[13] and 1986.[11] The idea is to first sort all the segment endpoints by polar angle, and then iterate over them in that order. During the iteration, the event line is maintained as a heap. An efficient implementation was published in 2014.[9]

Generally intersecting segments edit

For a point among generally intersecting segments, the visibility polygon problem is reducible, in linear time, to the lower envelope problem. By the Davenport–Schinzel argument, the lower envelope in the worst case has   number of vertices, where   is the inverse Ackermann function. A worst case optimal divide-and-conquer algorithm running in   time was created by John Hershberger in 1989.[14]

References edit

  1. ^ Franco P. Preparata and Michael Ian Shamos (1985). Computational Geometry - An Introduction. Springer-Verlag. ISBN 0-387-96131-3. 1st edition; 2nd printing, corrected and expanded, 1988: ISBN 3-540-96131-3; Russian translation, 1989: ISBN 5-03-001041-6.
  2. ^ a b El Gindy, Hossam; Avis, David (1981). "A linear algorithm for computing the visibility polygon from a point". Journal of Algorithms. 2 (2): 186–197. doi:10.1016/0196-6774(81)90019-5.
  3. ^ a b Lee, D. T. (May 1983). "Visibility of a simple polygon". Computer Vision, Graphics, and Image Processing. 22 (2): 207–221. doi:10.1016/0734-189X(83)90065-8.
  4. ^ a b Joe, Barry; Simpson, R. B. (1987). "Corrections to Lee's visibility polygon algorithm". BIT Numerical Mathematics. 27 (4): 458–473. doi:10.1007/BF01937271. S2CID 19112466.
  5. ^ Guibas, Leonidas; Motwani, Rajeev; Raghavan, Prabhakar (1992). The robot localization problem in two dimensions. ACM-SIAM symposium on Discrete algorithms. Society for Industrial and Applied Mathematics.
  6. ^ Liow, Nicklaus. "SIGHT & LIGHT how to create 2D visibility/shadow effects for your game". Retrieved 9 May 2014.
  7. ^ Patel, Amit (5 July 2012). "2d Visibility Algorithm". Retrieved 9 May 2014.
  8. ^ a b Patel, Amit (5 July 2012). "Blobs in Games: 2d Visibility". Retrieved 9 May 2014.
  9. ^ a b Bungiu, Francisc; Hemmer, Michael; Hershberger, John; Huang, Kan; Kröller, Alexander (2014). "Efficient Computation of Visibility Polygons". arXiv:1403.3905 [cs.CG].
  10. ^ Heffernan, Paul; Mitchell, Joseph (1995). "An optimal algorithm for computing visibility in the plane" (PDF). SIAM Journal on Computing. 24 (1): 184–201. doi:10.1137/S0097539791221505. hdl:1813/8838.
  11. ^ a b Suri, Subhash; O'Rourke, Joseph (1986). Worst-case optimal algorithms for constructing visibility polygons with holes. Symposium on Computational geometry. ACM. pp. 14–23. doi:10.1145/10515.10517.
  12. ^ Arkin, E.; Mitchell, Joseph (1987). An optimal visibility algorithm for a simple polygon with star-shaped holes (Technical report). Cornell University Operations Research and Industrial Engineering. 746.
  13. ^ Asano, Tetsuo (1985). An efficient algorithm for finding the visibility polygon for a polygonal region with holes. Institute of Electronics, Information, and Communication Engineers. Vol. 68. pp. 557–559.
  14. ^ Hershberger, John (1989). "Finding the upper envelope of   line segments in   time". Information Processing Letters. 33 (4): 169–174. doi:10.1016/0020-0190(89)90136-1.

External links edit

Software edit

  • VisiLibity: A free open source C++ library for visibility computations in planar polygonal environments.
  • visibility-polygon-js: A public domain Javascript library for computing a visibility polygon for a point among segments using the angular sweep method.