如何让boost::geometry::intersection返回两个ring相交的linestring
问题原因
你遇到的问题是输入输出的几何类型语义不匹配导致的:boost::geometry中ring类型默认代表面的外边界,属于面语义的几何对象。两个面的交集默认返回面类型结果,你用linestring容器接收返回值时,库只会提取两个面边界的交点,每个交点会被封装为长度为0的linestring(首尾坐标相同),就是你现在看到的输出。
修改方案
如果你的需求是获取两个ring代表的面的交集区域的边界,需要先接收面类型的交集结果,再提取其外边界即可,代码修改如下:
#include <boost/geometry.hpp> #include <boost/geometry/geometries/point_xy.hpp> #include <iostream> namespace bg = boost::geometry; typedef bg::model::point<double, 2, bg::cs::cartesian> point_t; typedef bg::model::linestring<point_t> linestring_t; typedef bg::model::ring<point_t> ring_t; typedef bg::model::polygon<point_t> polygon_t; int main() { point_t ptA0(0, 0); point_t ptA1(10, 0); point_t ptA2(10, 10); point_t ptA3(0, 10); ring_t ringA; bg::append(ringA, ptA0); bg::append(ringA, ptA1); bg::append(ringA, ptA2); bg::append(ringA, ptA3); bg::append(ringA, ptA0); point_t ptB0(5, -5); point_t ptB1(15, -5); point_t ptB2(15, 5); point_t ptB3(5, 5); ring_t ringB; bg::append(ringB, ptB0); bg::append(ringB, ptB1); bg::append(ringB, ptB2); bg::append(ringB, ptB3); bg::append(ringB, ptB0); // 用多边形容器接收面交集结果 std::vector<polygon_t> res_poly; bg::intersection(ringB, ringA, res_poly); for (size_t i = 0; i < res_poly.size(); i++) { // 提取多边形的外边界,就是你需要的相交区域的闭合线段 auto& intersect_ring = res_poly[i].outer(); std::cout << bg::dsv(intersect_ring) << std::endl; } return 0; }
运行后输出为:
((5, 0), (10, 0), (10, 5), (5, 5), (5, 0))
你可以根据需要从这个闭合ring中提取对应线段即可。
内容的提问来源于stack exchange,提问作者hwx
相关产品推荐
相关产品推荐

