Your approach is good. There are a few points to clarify.
Suppose that the graph is flat (if it is not so difficult to determine the face) and that there are no vertices with degree one. Vertices with degree one are not a problem, but it is easier to describe a solution without them :-)
Note that each edge will have two faces. So, if you follow the face in the most acute angle, than you follow these edges only on one side. The solution is to create a directed graph with the same nodes and for each edge create two edges in both directions. In general, the same graph as the initial graph, but the edges are doubled. Algorithm:
take one (directed) edge follow it in same way by smallest angle make faces of that cycle remove face (directed) edges from graph repeat procedure until there are edges.
The same approach works for graphs with vertices of the first degree, but the face will have a โcutโ (edge โโin one direction than in the opposite direction).
If you do not need an external face, than not "double" the outer edges, but make only one edge in a positive direction from each outer edge.
Update
Since each edge of the polygon and the polygon is transmitted only once, I think this is a fairly optimal solution. Just a few possibilities.
The main step in the algorithm is to select the next edge from the last visited node. A simple implementation is to calculate the angles of the outer edges and do the following. Calculation of angles can be done once, and not every time an edge visits a node, and even an in-edge โ out-edge mapping can be performed for a node.
There is no need to create a new oriented graph; it is enough to store direction data for each edge. Two boolean variables are sufficient, one for each direction. With this first step, choosing an unvisited edge to launch a new polygon becomes more complex. This can be covered if the top corner calculation is used, removing visited corners from the map and marking node as visible if there are no more corners on the map.