使用 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?的主要内容,如果未能解决你的问题,请参考以下文章