I think I first got introduced to this with the UPenn Robotics course.
A visibility graph is a graph where each vertex represents an object or a point, and edges between vertices represent unobstructed lines of sight between them.
We can compute the shortest path between two points in a 2D space with obstacles by using the visibility graph of the obstacles.
Note: In practice, we may want to pretend that the robot is actually a bit bigger than it truly is. This would inflate the configuration space obstacles by a safety margin so our trajectory doesn’t clip the obstacles so closely.
Once we’ve constructed the Visibility Graph, we can readily solved for the shortest path using Grassfire, Dijkstra, or the A* algorithm.
This visibility graph algorithm is complete (i.e. it will find a path if one exists and report failure if no path can be constructed).