为增量Convex Hull

时间:2016-09-28 22:07:57

标签: c++ qt boost graph

我正在尝试创建一些类来构建O(N * logN)中的云点的 3D Convex Hull

我已经解决了复杂度为O(N²)的天真问题,其中 N 是点数。 它的工作原理如下:

我有一个std ::点数列表。这些点是我创建的类的等级。 我随机化列表并逐一提取列表中的所有点。 对于每个点,我检查从那一点可见的哪个方面。因此,复杂性太高,因为方面是O(N)(大于6 * N)

然后我做一些操作来删除可见方面,找到地平线并将该点与地平线连接起来。有关这些操作的信息无助于解决我的问题。

我需要的是一个创建和处理二分图的示例,该图可以快速添加和删除节点。

我尝试构建自己的类,但是因为我的图表太慢而失败了。 但是几天前我发现boost库有解决方案:this

但我一直坚持如何用所有这些选项创建我的简单图形,我不明白如何创建它。我已经阅读了很多次这篇文档...

现在,问题是: 如何使用boost建立二分图?

必须是:

  • 双向的;
  • bipartite:一种类型的节点将是Pointd,另一种类型将是Dcel :: Face;
  • Pointd Nodes必须链接该点可以看到的所有方面;
  • Dcel :: Face方法必须链接所有可以看到它的点。
  • 快速删除并添加操作。

我不关心内存使用情况。我只需要快速。

这是我的第一个问题,所以我不知道是否清楚。 如果有人能够如此友好地给我一个例子,说明如何构建具有我给你的这些特征的图形,那将是很棒的。 如果您知道其他方法可以轻松创建它,那么它也会很好。

1 个答案:

答案 0 :(得分:0)

当你说双向时,我认为你的意思是无向的。如果这意味着您希望图表被定向但是可以访问顶点的入边和出边,那么只需将boost::undirectedS替换为boost::bidirectionalS 关于它的创建,你可以做到这一点:

#include <cstdint>
#include <boost/graph/adjacency_list.hpp>

enum class vertex_kind : std::uint8_t {
    POINTD,
    DCEL_FACE,
    UNKNOWN
};

struct pointd_property { /* Whatever is needed */ };
struct dcel_face_property { /* Whatever is needed */};

struct vertex_property {
    vertex_kind kind;
    union {
        pointd_property pointd;
        dcel_face_property dcel_face;
    };
    vertex_property() : kind(vertex_kind::UNKNOWN) {}
    vertex_property(pointd_property const& pprop) : kind(vertex_kind::POINTD) { new (&pointd) pointd_property(pprop); }
    vertex_property(dcel_face_property const& fprop) : kind(vertex_kind::DCEL_FACE) { new (&dcel_face) dcel_face_property(fprop); }
};

typedef boost::adjacency_list<boost::vecS, boost::hash_setS, boost::undirectedS, vertex_property> graph_type;

现在填充图表非常简单:

auto graph = []() {
    graph_type g;
    auto a = boost::add_vertex({pointd_property()}, g);
    auto b = boost::add_vertex({dcel_face_property()}, g);
    boost::add_edge(a, b, g);
    return g;
} ();
// Do whatever you please with g.

当然,顶点属性的内容应符合您打算使用的BGL算法的要求。如果有任何要求,请告诉我,以便我可以编辑我的答案。