boost库之geometry

2023-05-16

Boost.Geometry介绍_love code, love life.-CSDN博客_boost geometry

#include <boost/assign.hpp>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/geometries/ring.hpp>
#include <boost/geometry/geometries/polygon.hpp>
namespace bg = boost::geometry;
typedef bg::model::d2::point_xy<double> DPoint;
typedef bg::model::segment<DPoint> DSegment;
typedef bg::model::linestring<DPoint> DLineString;
typedef bg::model::box<DPoint> DBox;
//这里的ring就是我们通常说的多边形闭合区域(内部不存在缕空),模板参数为true,表示顺时针存储点,为false,表示逆时针存储点,由于MM_TEXT坐标系与传统上的坐标系的Y轴方向是相反的,所以最后为false,将TopLeft、TopRight、BottomRight、BottomLeft、TopLeft以此存储到ring中,以便能正确计算
typedef bg::model::ring<DPoint, false> DRing;
//polygon模板参数false,也是由上面相同的原因得出来的
typedef bg::model::polygon<DPoint, false> DPolygon;

int _tmain(int argc, _TCHAR* argv[])
{
    DPoint pt0(100, 100);
    DPoint pt1(200, 200);
    DSegment sg0(pt0, pt1);

    double dDistance = 0;
    
    //1、点到点的距离
    dDistance = bg::distance(pt0, pt1);
    //2、点到线段的距离,如果点到直线的垂足不在线段上,所计算的距离为(点到直线的距离、线段到垂足延长的距离之和)
    dDistance = bg::distance(DPoint(200, 100), sg0);
    dDistance = bg::distance(DPoint(100, 0), sg0);

    //3、判断线段是否相交
    DSegment sg1(DPoint(0, 100), DPoint(100, 0));
    DSegment sg2(DPoint(100, 200), DPoint(200, 100));
    bool bIntersect = false;
    bIntersect = bg::intersects(sg0, sg1);
    bIntersect = bg::intersects(sg0, sg2);

    //4、求线段与线段的交点
    std::list<DPoint> lstPoints;
    bg::intersection(sg0, sg1, lstPoints);
    lstPoints.clear();
    bg::intersection(sg0, sg2, lstPoints);

    DBox rc2(DPoint(0, 0), DPoint(0, 0));

    //5、判断box是否相交
    DBox rc(DPoint(0, 0), DPoint(200, 200));
    DBox rc0(DPoint(250, 250), DPoint(450, 450));
    DBox rc1(DPoint(100, 100), DPoint(300, 300));

    bIntersect = bg::intersects(rc, rc0);
    bIntersect = bg::intersects(rc, rc1);
    //bg::intersection(rc, rc0, container);//error

    //6、判断box是否与LineString相交
    DLineString line0;

    line0.push_back(DPoint(10, 250));
    line0.push_back(DPoint(100, 100));
    line0.push_back(DPoint(120, -10));
    line0.push_back(DPoint(210, 200));
    bIntersect = bg::intersects(rc, line0);
    bIntersect = bg::intersects(rc0, line0);

    //7、求box与linestring的交点
    std::list<DLineString> lstLines;
    bg::intersection(rc, line0, lstLines);

    //8、点是否在box内
    DBox rc7(DPoint(0, 0), DPoint(100, 100));
    bool bInside = false;
    bInside = bg::within(DPoint(50, 50), rc7);
    bInside = bg::within(DPoint(0, 0), rc7);

    //9、判断LineString与LineString是否相交
    DLineString line1, line2, line3;

    line1.push_back(DPoint(50, 50));
    line1.push_back(DPoint(150, 50));
    line1.push_back(DPoint(50, 200));
    line1.push_back(DPoint(150, 200));
    line2.push_back(DPoint(100, 0));
    line2.push_back(DPoint(70, 100));
    line2.push_back(DPoint(150, 210));
    line3.push_back(DPoint(200, 0));
    line3.push_back(DPoint(200, 200));

    bIntersect = bg::intersects(line1, line2);
    bIntersect = bg::intersects(line1, line3);

    //10、求LineString与LineString的交点
    lstPoints.clear();
    bg::intersection(line1, line2, lstPoints);
    lstPoints.clear();
    bg::intersection(line1, line3, lstPoints);


    //11、判断ring与ring是否相交
    DPoint arDPoint0[6] = {DPoint(0, 0), DPoint(100, 0), DPoint(200, 100), DPoint(100, 200), DPoint(0, 200), DPoint(0, 0)};
    DPoint arDPoint1[6] = {DPoint(100, 100), DPoint(200, 0), DPoint(300, 0), DPoint(300, 200), DPoint(200, 200), DPoint(100, 100)};
    DRing r0(arDPoint0, arDPoint0 + 6);
    DRing r1(arDPoint1, arDPoint1 + 6);
    bIntersect = bg::intersects(r0, r1);

    //12、求ring与ring的交点
    lstPoints.clear();
    bg::intersection(r0, r1, lstPoints);

    DPolygon poly1;
    DPolygon poly2;
    DPolygon poly3;

    auto lstOf = boost::assign::list_of(DPoint(0, 0))(DPoint(200, 0))(DPoint(200, 200))(DPoint(0, 200))(DPoint(0, 0));
    poly1.outer().assign(lstOf.begin(), lstOf.end());
    lstOf = boost::assign::list_of(DPoint(50, 50))(DPoint(150, 50))(DPoint(150, 150))(DPoint(50, 150))(DPoint(50, 50));
    poly1.inners().push_back(lstOf);
    lstOf = boost::assign::list_of(DPoint(100, 0))(DPoint(120, 0))(DPoint(120, 200))(DPoint(100, 200))(DPoint(100, 0));
    poly2.outer().assign(lstOf.begin(), lstOf.end());
    lstOf = boost::assign::list_of(DPoint(100, 60))(DPoint(120, 60))(DPoint(120, 140))(DPoint(100, 140))(DPoint(100, 60));
    poly3.outer().assign(lstOf.begin(), lstOf.end());

    //13、判断polygon与polygon是否相交
    bIntersect = bg::intersects(poly1, poly2);
    bIntersect = bg::intersects(poly1, poly3);

    //14、求polygon与polygon相交的区域
    std::list<DPolygon> lstPolygon;

    bg::intersection(poly1, poly2, lstPolygon);
    lstPolygon.clear();
    bg::intersection(poly1, poly3, lstPolygon);

    //15、判断点是否在polygon内
    bInside = bg::within(DPoint(100, 100), poly1);
    bInside = bg::within(DPoint(25, 25), poly1);

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost库之geometry 的相关文章

  • 二维几何:如何检查点是否在角度内

    我有以下二维几何问题 我有一个点 从该点投射一个无限角度 2D 锥体 该角度由方向和角度给出 该点和方向形成一个向量 并且角度的每一侧一半形成 2D 锥体 现在我想检查 2D 中的另一个点是在这个圆锥体内部还是外部 如何才能实现这一目标 谢
  • 配置错误:无法链接到 boost_system

    我正在尝试在 Debian 上安装一个软件包 足球模拟器 2d 当我进入目录并运行时 configure 我得到以下信息 reza debian soccer rcssserver 15 0 1 configure checking for
  • 使用 boost 几何检查两条线是否有交点

    是否可以使用 boost geometry 检查两条线段 每条线段由二维中的两个点给出 是否彼此相交 如果可能的话 boost geometry 是否还允许检查特殊情况 例如另一条线上只有一个点 数字上 或者两条线相等 如果你具体谈论Boo
  • 找到两个移动物体的更好交点

    我想极大地优化我的算法之一 我将尽力以最好的方式解释它 主题 我们当时处于二维欧几里德系统中t 0 在这个系统中有两个对象 O1 and O2 O1 and O2分别位于点PA and PC O1移动于常数和已知点方向的速度PB 当物体到达
  • 它如何清除已经在链中排队的所有已发布任务?

    如何清除已在队列中排队的所有已发布任务io service strand 我在boost文档中没有看到类似的方法 我还没有找到它的需要 因为它可以通过正确设计异步调用链来正确解决 一般来说 Boost Asio API 经过精心设计 可以防
  • Xcode 4 上的 Boost 库静态链接

    我在 OS X 上使用 Xcode 使用 Boost 库 Boost 使用 macports 安装在我的系统上 通过将我需要的 3 个 boost 库 例如 libboost thread mt a 添加到 Targets Link Bin
  • 以一定角度遍历二维数组

    通常我们按行或列遍历数组 但这里我想以角度遍历它 我会尝试解释我的意思 因此 假设角度是 45 度 那么它会搜索为 0 0 then 0 1 1 0 then 0 2 1 1 2 0 等等 抱歉 无法上传图像 因为我是新用户 不允许这样做
  • 无法运行bjam编译boost python教程

    我正在尝试跟随本教程 http www boost org doc libs 1 55 0 libs python doc tutorial doc html python hello html关于为 Windows 的 python 包装
  • 如何为 Visual Studio 代码设置 boost

    所以我基本上构建了整个boost库并将它们放在C boost include boost 1 73中 但我有一种感觉 在使用这个库之前我必须包含更多步骤 我一直遵循本指南 直到将其设置为 Visual Studio 代码 所以现在我正在互联
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • Boost async_write问题

    我将展示一些代码 void wh const boost system error code ec std size t bytes transferred std cout lt lt test int main int argc cha
  • 获取测试用例中的 BOOST TEST 测试套件名称

    我在用着BOOST TEST我想知道是否有办法找出test suite从里面test case 我知道我能找到test case的名字由 boost unit test framework current test case p name
  • Boost + Visual Studio 2010 + Windows 平台 SDK 7.1

    有人可以告诉我 bjam 的命令行开关或其他可以使用新的 Windows Platform SDK 7 1 工具链使用 VS2010 进行 boost 编译的东西吗 您可以在普通的视觉工作室项目中设置该选项 默认值是 v100 是平台 7
  • 有没有办法在 JTS 中将自相交多边形转换为多重多边形?

    取无效多边形POLYGON 0 100 100 100 0 0 100 0 0 100 一个带有未声明交点的煮蛋定时器形状 许多说明说 JTS 可以使用以下命令创建此版本的有效版本 buffer method Geometry input
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 用 tkinter 画圆更简单的方法?

    在a上画一个圆tkinter Canvas通常由create oval方法 然而 提供边界框通常是绘制圆的一种令人困惑的方式 想出一个捷径并不是特别困难 但我找不到其他人在做类似的事情 所以我将其发布 希望其他人发现它有用 这是一个称为猴子
  • 如何在 C++ 中为 MPL 向量的所有成员显式实例化模板?

    考虑以下头文件 Foo h class Foo public template
  • 为什么Boost的`bcp smart_ptr dir/`复制了6MB的源代码?

    所以我想从 boost 中分离出智能指针来在我的项目中使用 并且我被引导使用bcp公用事业 今天我把它编译并做了bcp smart ptr to copy to my project 结果 6MB 代码to copy to my proje
  • BOOST 中的属性图是什么?

    有人可以向像我这样的 Boost 初学者解释一下 Boost 中的属性映射是什么吗 我在尝试使用 BGL 计算强连通分量时遇到了这个问题 我浏览了属性映射和图形模块的文档 但仍然不知道如何理解它 以这段代码为例 make iterator

随机推荐

  • NVIDIA Jetson Xavier NX入门(2)——系统设置;环境搭建

    NVIDIA Jetson Xavier NX入门 xff08 2 xff09 系统设置 环境搭建 1 NVIDIA Jetson Xavier NX连接显示器 键盘 鼠标 xff1b 2 Jetson Xavier NX连接电源后 xff
  • NVIDIA Jetson Xavier NX使用UART进行串口通信

    NVIDIA Jetson Xavier NX使用UART进行串口通信 一 NVIDIA Jetson Xavier NX的40pin接口 NVIDIA Jetson Xavier NX开发板俯视图 xff1a 2 开发板上打印出的UART
  • 远程服务器时Ubuntu报错:qt.qpa.xcb: could not connect to display

    远程服务器时Ubuntu报错 xff1a qt qpa xcb could not connect to display 远程服务器时Ubuntu报错 xff1a qt span class token punctuation span q
  • linux下USB设备编号固定

    linux下USB设备插入时系统自动分配编号 xff0c 多个相同设备时 xff0c 按插入顺序分配编号 以串口为例 xff0c 插入的USBtoSerial顺序不一样时 xff0c 系统分配的设备号是不一样的 但是每个USB接口对设备来说
  • Java进阶书籍推荐

    学习Java xff0c 书籍是必不可少的学习工具之一 xff0c 尤其是对于自学者而言 废话不多说 xff0c 下边就给大家推荐一些Java进阶的好书 第一部分 xff1a Java语言篇 1 Java编程规范 适合对象 xff1a 初级
  • GitHub+Docker Hub自动构建镜像

    一 什么是Dockerfile xff1f Dockerfile是一个包含用于构建镜像的命令的文本文档 可以使用在命令行中调用任何命令 Docker通过读取Dockerfile中的指令自动生成镜像 它们简化了从头到尾的流程并极大的简化了部署
  • 前端工程化 - 剖析npm的包管理机制(完整版)

    导读 现如今 xff0c 前端开发的同学已经离不开 npm 这个包管理工具 xff0c 其优秀的包版本管理机制承载了整个繁荣发展的NodeJS社区 xff0c 理解其内部机制非常有利于加深我们对模块开发的理解 各项前端工程化的配置以加快我们
  • GPRS模块开发初步(软件)

    文章来源 xff1a http blogold chinaunix net u1 56388 showart 1121149 html 1 AT 指令简介 AT 指令集一般指专门用来控制调制解调器的指令集 该指令集最初由美国 Hayes 公
  • 【安装库】matlab2020b安装及百度网盘提速

    安装库 matlab2020b安装及百度网盘提速 matlab2020b安装 一 xff0c 下载 百度网盘 链接 xff1a https pan baidu com s 18iLFaAbWt8IntUefX3eWfA 提取码 xff1a
  • FreeRTOS系统中CPU使用率统计方法分析

    FreeRTOS系统中CPU使用率统计方法分析 基本概念 操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标 它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题 而CPU使用率也不能过高 xff0c 避免资源
  • NVIDIA GeForce 940M 设备是不可移动的,无法弹出或拔出问题解决办法

    上个月在新入手的笔记本上安装了一个CUDA的开发环境 xff0c 并选择安装了GeForce Experience工具 xff0c 前两天打开GeForce Experience工具浏览时 xff0c 工具提醒可以更新NVIDIA显卡驱动
  • 大学生职业规划要穿“营销三点式”

    我们现在就是这样的环境 xff0c 这样的 教育 xff0c 这样的模式 xff0c 这一切是无法改变的 xff0c 那你适应它吗 xff1f 不是 xff0c 你若适应它 xff0c 你只能茫然 xff01 为什么 xff1f 因为你适应
  • 网络与串口调试工具TCPCOM

    TCPCOM xff0c 网络与串口二合一调试助手 xff0c 将网络调试助手与串口调试助手合二为一 xff0c 绿色软件 xff0c 简单高效 软件特色 1 支持中英文双语言 xff0c 自动根据操作系统环境选择系统语言类型 xff1b
  • Cmake以及CmakeLists

    CMake使用 CMake1 gcc make和CMake的关系2 CMake一般使用流程2 1 生成构建系统2 2 执行构建 xff08 比如make xff09 xff0c 生成目标文件 xff1b 2 3 执行测试 安装或打包 3 C
  • 卡尔曼滤波公式及其详细推导(不涉及矩阵求导)

    卡尔曼滤波公式及推导 1 前言 卡尔曼滤波 Kalman Filter 是一种关于线性离散系统滤波问题的递推算法 其使用递推的形式对系统的状态进行估计 xff0c 以测量中产生的误差为依据对估计值进行校正 xff0c 使被估计的状态不断接近
  • Nmap常用命令及扫描原理

    Nmap常用参数 sS TCP SYN扫描 sU UDP扫描 sA ACK扫描 sW 窗口扫描 scanflags RSTSYNFIN 自定义扫描 O 检测目标操作系统类型 sV 检测目标上运行服务的版本 v 增加输出信息的详细程度 vv
  • pixhawk无人机结合openmv之精准降落

    pixhawk飞控与openmv之精准降落 一 精准降落概述二 精准降落流程三 代码逻辑流程四 总结反思改进 一 精准降落概述 1 概述 无人机在生产生活中逐渐获得更大的用途 xff0c 京东的物流无人机有望解决用户快递最后一分钟的问题 x
  • ROS Catkin 教程之 catkin_package(...) 到底在做什么?

    While looking at a CMakeLists txt file I was wondering the exact meaning of the CATKIN DEPENDS option of the catkin pack
  • c++中的sstream

    include lt sstream gt 头文件中主要包含了stringstream xff0c 可以用来进行数据格式转换 std stringstream ss 1 注意每当调用一次 lt lt 和 gt gt 后 xff0c stri
  • boost库之geometry

    Boost Geometry介绍 love code love life CSDN博客 boost geometry include lt boost assign hpp gt include lt boost geometry geom