使用 C++ boost 库如何创建两个圆圈并将它们添加到 boost R-tree?

Posted

技术标签:

【中文标题】使用 C++ boost 库如何创建两个圆圈并将它们添加到 boost R-tree?【英文标题】:Using the C++ boost library how can I create two circles and add them to a boost R-tree? 【发布时间】:2016-01-23 22:48:02 【问题描述】:

我正在尝试制作一个简单的二维“物理”模拟,主要涉及圆形物体的碰撞,为了避免编写我自己的空间索引(四叉树/r-tree/等),我希望使用 Boost 的 R -树。

问题是我在 Boost 文档中找不到任何关于如何创建圆形(或者甚至可能)的文档或示例。有大量关于创建任意多边形对象的文档。使用 Boost 几何库是否可以做到这一点,如果可以,如何做到这一点?

已编辑:澄清我不是在问一个人如何找到两个圆圈是否相交。

【问题讨论】:

在我看来,您有两个 不同 问题,一个是制作“圆圈”(无论在您的上下文中是什么意思),另一个是检查交叉点。确实如此,那么您应该问两个不同的问题。 如果两个中心之间的距离小于它们的半径之和,那么它们相交。 @Joachim Pileborg 问题的目的是确定是否可以使用表示圆的 boost 几何库创建对象(类似于创建多边形对象的方式),如果可以,是否支持 boost圆的几何布尔运算符。 (交叉点、联合等)。你能告诉我你是否认为有更好的方法来改写这个问题? @101010 我对造成的误解深表歉意,我了解检查两个圆是否相交的一般几何方法,我试图确定是否有办法使用 boost 库(主要用于将所述圆形对象放入 boost 提供的 r-tree 的目的。) 【参考方案1】:

要在boost中制作磁盘,可以使用缓冲方法(有关buffer function和strategies的详细信息,请参阅doc):

// boost namespace and types
namespace bg  = boost::geometry;
typedef bg::model::d2::point_xy<double> BPoint;
typedef bg::model::polygon<BPoint> BPolygon;
typedef bg::model::multi_polygon<BPolygon> BMultiPolygon;

// declare all buffer strategies
int points_per_circle(10);
bg::strategy::buffer::join_round join_strategy(points_per_circle);
boost::geometry::strategy::buffer::end_flat end_strategy;
bg::strategy::buffer::point_circle circle_strategy(points_per_circle);
bg::strategy::buffer::side_straight side_strategy;

// set the distance strategy
double radius = 20;
bg::strategy::buffer::distance_symmetric<double> distance_strategy(radius);

BPoint center = BPoint(0, 0);
BMultiPolygon tmp;  // buffer generates multipolygons
BPolygon disk;

// make disk centered on `center` and of correct `radius`
bg::buffer(start, tmp, distance_strategy, side_strategy,
           join_strategy, end_strategy, circle_strategy);

// convert the MultiPolygon output to a simple polygon
disk = BPolygon(tmp[0]);

【讨论】:

以上是关于使用 C++ boost 库如何创建两个圆圈并将它们添加到 boost R-tree?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 boost 创建线程池?

如何在 C++ 中通过 Rcpp 使用 Boost 库

如何使用 boost::test 设置 c++ 龟模拟库?

C++两个矩阵库

如何在 C++ 中生成 UUID,而不使用 boost 库?

如何通过 Boost C++ 库与 3D 多边形相交?