问题描述
我有一个半边的实现,我正在尝试对边进行排序,以使边n + 1是边n对。
设置
我想就地执行此操作以节省内存,但我发现不确定如何解决的理论壁。
让我们假设HE存储在列表中,并且您可以通过自定义getter(例如.Pair()
或.Next()
)访问其成员。
算法的思想很简单。
for(uint i=0; i<half_edges.size(); i+=2)
{
swap(half_edges[i+1],half_edges[i].Pair()); // This is pseudo code,assume this works
}
这就是主意,只要将您旁边的他换成您所在位置的对子即可。
现在,您当然需要更新指针,因此,对于最初为$ i + 1 $的货币对和HE,您都必须经历以下繁琐的过程:
faces[old_pair_face].edge = i + 1;
verts[old_pair_vert].edge = i + 1;
edges[old_pair_prev].next = i + 1;
edges[old_pair_next].prev = i + 1;
edges[i].pair = i + 1;
faces[old_other_face].edge = old_pair_index;
verts[old_other_vert].edge = old_pair_index;
edges[old_other_prev].next = old_pair_index;
edges[old_other_next].prev = old_pair_index;
edges[old_other_pair].pair = old_pair_index;
基本上只是更新所有指向原始2个元素的指针。
错误
上面的ALMOST起作用。但是,请考虑以下情况。假设我们在边缘i
处。这对i
是j
,next
的{{1}}是j
。
因此i+1
和i + 1
交换,因此一对j
现在位于i
。然后,您想更新指向i + 1
的{{1}},因此在这种特定情况下,交换会无意间使next
指向您自己。这是无效的,因为“半边”不允许边指向自身。
这种情况很少见,所以花了我一段时间才找到,但这显然是我的逻辑上的错误。
问题是,考虑到已经实现的半边,如何在O(1)内存中排序其边,使n和n + 1成对,同时避免上述陷阱?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)