用STL在C++中实现Bentley-Ottmann

Implementing Bentley-Ottmann in C++ using the STL

本文关键字:实现 Bentley-Ottmann C++ STL      更新时间:2023-10-16

我想在这个描述的基础上,使用STL元素来实现Bentley-Ottmann线段交叉算法。Bentley Ottmann维基百科

我正在努力实现优先级队列。描述要求我删除任何交叉点:

如果p是线段s的左端点,则将s插入T中。找到T中s正下方和正上方的线段r和T(如果存在),如果它们的交叉点在事件队列中形成潜在的未来事件,则将其删除。如果s与r或T交叉,则将这些交叉点添加为事件队列中的潜在未来事件。

似乎不可能使用STL优先级队列作为事件队列,因为它的搜索复杂度是线性的,我需要找到并删除st的任何交叉点。我应该用一套吗?或者使用优先级队列是否可行?

有一些优先级队列结构可以快速删除,但它们需要大量额外的内存。

实际上,只将r-t交叉点留在队列中更有效。然后,到了处理事件的时候,如果它无效(因为r和t不相邻)或已经完成,就忽略它。

为了检测r-t何时已经完成,只需确保您的优先级队列按总排序排序,即不要只比较事件的x值。当多个事件具有相同的x值时,请使用所涉及的段的标识符来断开连接。然后,当r-t在队列中多次出现时,所有的出现都将在一起,您可以按顺序将它们全部弹出。