【问题标题】:Creating Bipartite Graph for incremental Convex Hull为增量凸包创建二分图
【发布时间】:2016-09-28 22:07:56
【问题描述】:

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

我已经解决了复杂度为 O(N²) 的简单问题,其中 N 是点数。 它的工作原理是这样的:

我有一个 std::list 点。这些点是我创建的一个类的实例。 我将列表随机化并从列表中一一提取所有点。 对于每一点,我都会检查从该点可以看到哪些方面。所以,复杂度太高了,因为facets是O(N)(超过6*N)

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

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

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

但我不知道如何使用所有这些选项创建我的简单图表,我不明白如何创建它。我已经阅读了很多次这个文档......

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

一定是:

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

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

这是我的第一个问题,所以我不知道是否清楚。 如果有人好心给我一个例子,说明我如何用我给你的这些特征构建一个图表,那就太好了。 如果你知道其他方法可以轻松创建它,那也很好。

【问题讨论】:

  • 我发现了一个类似的问题,但对我没有帮助。也许可以帮助别人。 this 。我的问题很相似,但我想要 2 个不同类型的节点。
  • 你的节点类型携带的信息是什么?

标签: c++ qt boost graph


【解决方案1】:

当您说双向时,我假设您的意思是无向的。如果这意味着您希望图形被定向但可以访问顶点的内外边,那么只需将 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算法的要求。如果有任何要求,请告诉我,以便我编辑答案。

【讨论】:

  • 完美。我必须测试在图中搜索节点的计算复杂度是否为 log(n)。但你的答案是我正在寻找的。即使您认为图形是无向的,您也是对的。谢谢。
  • @Giorgio 了解您想在图表上应用的实际算法会很有帮助
  • 我只是想实现一个增量凸包。仅此而已。
猜你喜欢
  • 2016-05-01
  • 2013-03-24
  • 2016-02-23
  • 2018-08-14
  • 2018-12-29
  • 2013-10-13
  • 2011-02-15
  • 2014-10-25
  • 1970-01-01
相关资源
最近更新 更多