My C-Space construction algorithm is rather simple: I essentially expand the boundaries of each obstacle by the length of the diagonal of the robot. Since my robot turns in place, and I did not wish to have to construct the real C-Space in SE2, I approximated it in 2-d by expanding the obstacle by its diagonal rather than by the robot's width and height at each time step. The boundary produced is thus equivalent to tracing the robot around the obstacle with the center of the robot as the reference point.
After the intial boundary expansion for each obstacle (rectangle), I then see if any of the boundaries intersect with boundaries from other obstacles. If they do, I save that intersection point as a vertex on each obstacle so they can be properly included in the visibility graph.
To build the visibility graph, for each vertex v of a C-space obstacle, I drew a line to each of the other vertices. If these lines did not intersect with any configuration space obstacles, then the vertex the line was drawn to was added to the "neighbor" list of v. The start and end locations were also considered "vertices" for this purpose.
Once the graph was constructed as above, I used A* search (as in Assignment 4) to find the shortest path to the goal. I used the same heuristic of Euclidean distance to the goal for each vertex, and the cost function was the Euclidean distance between vertices.