【发布时间】:2012-10-29 00:09:55
【问题描述】:
我有一组定义多边形的边和顶点(不一定是凸的)。顶点和边是随机顺序的,我想按顺时针(或逆时针)方向对该多边形的顶点进行排序/排序。
知道如何实现吗?
【问题讨论】:
我有一组定义多边形的边和顶点(不一定是凸的)。顶点和边是随机顺序的,我想按顺时针(或逆时针)方向对该多边形的顶点进行排序/排序。
知道如何实现吗?
【问题讨论】:
我认为这本质上是柯尼斯堡桥问题的简化版本。
如果没有任何情况下两个以上的边连接在一个节点上,您可以构建一个相邻列表并“遍历”所有节点。
如果有 >2 条边在一个节点处连接的情况,...嗯,我认为可能的顺序不止一个。只需参考柯尼斯堡桥问题的解决方案即可。
for v,u in edges:
adjacent[v].append(u)
adjacent[u].append(v)
order=[]
start = v0 #start from an arbitrary node
def draw(now,last):
if now==start and len(order)>0:
return
order.append(now)
for i in adjacent[now]:
if i != last:
draw(i,now)
draw(start,NULL)
【讨论】:
我假设 CW/CCW 方向无关紧要(保证一个或另一个要复杂得多)。这种伪代码算法对顶点进行顺时针或逆时针排序。
marked_edge <- any edge
first <- marked_edge.start
list <- [first]
current <- marked_edge.end
while current <> first
list <- list + [current]
new_edge <- find the edge that is not the marked_edge and has the vertex current as either start or end
if new_edge.start=current then
current <- new_edge.end
else
current <- new_edge.start
endif
marked_edge <- new_edge
endwhile
【讨论】: