擅长:python、mysql、java
<p>{你想把它表示成一个无限的面,比如说你想计算一个无限的线段</p>
<pre><code>[((x1, y1), (x2, y2)), ((x3, y3), (x4, y4)), ...].
</code></pre>
<p>第一步是计算组合嵌入。把每一个片段和它的反面插入到列表的dict中,如下所示。(所有这些Python<strong>都未经测试</strong>)</p>
^{pr2}$
<p>现在,按角度对每个列表排序。为了简单起见,我将使用<code>atan2</code>。在</p>
<pre><code>for (x1, y1), p2s in graph.items():
p2s.sort(key=lambda (x2, y2): math.atan2(y2 - y1, x2 - x1))
</code></pre>
<p>在无限面上找到一个顶点。<strike>最底端,按最左边的方式断开领带</strike>最左端就可以了(代码按最底端断开领带,这并不重要)。在</p>
<pre><code>v0 = min(graph.keys())
</code></pre>
<p><code>v0</code>邻接列表上的第一条边在无限面上逆时针方向。从它的逆时针方向开始。在</p>
<pre><code>e0 = (graph[v0][0], v0)
</code></pre>
<p>现在,按以下方式迭代边。在</p>
<pre><code>e = e0
while True:
yield e
v = e[1]
neighbors = graph[v]
e = (v, neighbors[neighbors.index(e[0]) - 1])
if e == e0:
break
</code></pre>
<p>给定一条在无限面上顺时针定向的有向边,通过反转它来获得下一条边,然后以顺时针顺序定位具有相同尾部的下一条边。重复,直到回到起始边缘。在</p>