【问题标题】:Polygons in C++C++ 中的多边形
【发布时间】:2016-09-06 12:18:24
【问题描述】:

假设我在二维空间中有多个多边形,如下图所示:

每个多边形都用一个 x-y 坐标列表表示。例如,多边形 A 可以写成 PolygonA:{(3,4), (7,8),..., (3,4)}。生成所有多边形后,我们要对它们执行一些操作。例如,我们想知道矩形框内的所有多边形。或者对于某个多边形,我们想知道它的相邻多边形。这是我的问题:如何组织数据结构,以便对多边形的操作变得更容易和更有效。最直接的方法是将所有多边形放在一个矢量容器中。但是对它们的操作变得低效。关于正确的数据结构或库的任何想法?

【问题讨论】:

  • 这取决于操作的类型。你有一些示例代码要分享吗?
  • 可以细分二维空间。制作树状结构(如二叉空间树)。

标签: c++ boost


【解决方案1】:

现在这只是一个提示! 我会以不同的方式来做。 (正如您已经说过的)方式 对整个多边形进行操作的性能太差了。一个常用的帮助是将多边形分成更小的(更容易计算的)形状。

假设你有一个多边形。

再次,使用每个坐标进行操作.. 没办法。 假设您有一个算法,它根据“强度因子”返回许多形状。它可能看起来像这样。

std::vector<Shape> fill_with_shapes(const Polygon &a, float intensity); //example

强度越大,细节越多。

还有(如果你愿意的话)甚至更多。

使用矩形和三角形进行计算比使用整个多边形要简单得多。现在,我没有这样的“fill_with_shapes”函数的代码,同样,这个答案更像是一个建议你做任何操作之前。我希望这个想法有帮助!

【讨论】:

  • 另外,我会保存至少一个包含整个多边形的 AABB(与轴对齐的边界框),这样可以进行快速而廉价的测试以消除大多数多边形(沿轴对它们进行排序还可以提供帮助快速查找)
【解决方案2】:

我考虑使用 boost::geometry 库中的 r-tree,这似乎是一个不错的解决方案。我将代码发布如下:

#include<stdio.h>

#include <boost/geometry.hpp>
#include <boost/geometry/extensions/index/rtree/rtree.hpp>
#include <vector>


#include <boost/geometry.hpp>
#include <boost/geometry/extensions/index/rtree/rtree.hpp>

#include <random>

#include <iostream>
#include <exception>
#include <boost/foreach.hpp>

int main(void)
{
    namespace bg = boost::geometry;
    namespace bgi = boost::geometry::index;

    typedef bg::model::point<float,2,bg::cs::cartesian> point;
    typedef bg::model::box<point> box;

    typedef bgi::rtree<box,unsigned > rtreeType;

    rtreeType rtree(6,3);

    for(unsigned i=0; i<10; i++)
    {
        box b(point(i+0.1f,i+0.1f),point(i+0.5f,i+0.5f));
        rtree.insert(b,i);
    }

    box query_box(point(0,0),point(5,5));

    rtree.print();

    std::cout<<"number of elements: ";
    std::cout<<rtree.elements()<<std::endl;


    // application 1: search for boxes that are within query_box
    std::deque<unsigned> &boxValue=rtree.find(query_box);





    return 0;
}

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    相关资源
    最近更新 更多