You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:15:04