CGAL在ubuntu下的安装及Hello World的测试
ubuntu下的安装
CGAL安装
参考地址:https://doc.cgal.org/latest/Manual/usage.html
在ubuntu下安装:
sudo apt-get install libcgal-dev
安装后的路径:
注意安装这个步骤安装后,boost,CGAL,gmp,mpfr头文件都在/usr/include目录下。
boost,gmp,mpfr库文件都在/usr/lib/x86_64-linux-gnu目录下。CGAL5.0及以后版本只有头文件没有库文件
头文件路径: /usr/include/CGAL
库文件路径: /usr/lib/x86_64-linux-gnu
教程 Hello World
原文地址:https://doc.cgal.org/latest/Manual/tutorial_hello_world.html
本教程适用于了解 C++ 并具有几何算法基础知识的 CGAL 新手。第一部分展示如何定义点和线段类,以及如何对其应用几何谓词。本节进一步提高了人们的认识,即使用浮点数作为坐标时存在严重问题。在第二部分中,您将遇到一个典型的 CGAL 函数,它计算 2D 凸包。第三部分展示了Traits类的含义,第四部分解释了概念和模型的概念。
1 三点一线
在第一个示例中,我们演示了如何构造一些点和一段,并对它们执行一些基本操作。
所有 CGAL 头文件都位于子目录中include/CGAL。所有 CGAL 类和函数都在命名空间中CGAL。类以大写字母开头,全局函数以小写字母开头,常量全部大写。物体的尺寸用后缀表示。
几何基元,如点类型,是在kernel中定义的。我们为第一个示例选择的内核使用double精度浮点数作为该点的笛卡尔坐标。
除了类型之外,我们还看到诸如三点方向测试之类的谓词,以及诸如距离和中点计算之类的*结构。*谓词具有一组离散的可能结果,而构造则产生一个数字或另一个几何实体。
文件 Kernel_23/points_and_segment.cpp
#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
int main()
{Point_2 p(1,1), q(10,10); //构造点std::cout << "p = " << p << std::endl;std::cout << "q = " << q.x() << " " << q.y() << std::endl;//两点之间的距离std::cout << "sqdist(p,q) = "<< CGAL::squared_distance(p,q) << std::endl;Segment_2 s(p,q); //构造直线Point_2 m(5, 9);std::cout << "m = " << m << std::endl;//点到直线的距离std::cout << "sqdist(Segment_2(p,q), m) = "<< CGAL::squared_distance(s,m) << std::endl;std::cout << "p, q, and m ";switch (CGAL::orientation(p,q,m)){case CGAL::COLLINEAR:std::cout << "are collinear\n"; //共线break;case CGAL::LEFT_TURN:std::cout << "make a left turn\n"; //逆时针break;case CGAL::RIGHT_TURN:std::cout << "make a right turn\n"; //顺时针break;}std::cout << " midpoint(p,q) = " << CGAL::midpoint(p,q) << std::endl;return 0;
}
正如下一个示例所示,用浮点数处理几何图形可能会令人惊讶。
文件 Kernel_23/surprising.cpp
#include <iostream>
#include <CGAL/Simple_cartesian.h>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
int main()
{{Point_2 p(0, 0.3), q(1, 0.6), r(2, 0.9); //结果不共线std::cout << (CGAL::collinear(p,q,r) ? "collinear\n" : "not collinear\n");}{Point_2 p(0, 1.0/3.0), q(1, 2.0/3.0), r(2, 1); //结果不共线std::cout << (CGAL::collinear(p,q,r) ? "collinear\n" : "not collinear\n");}{Point_2 p(0,0), q(1, 1), r(2, 2); //结果共线std::cout << (CGAL::collinear(p,q,r) ? "collinear\n" : "not collinear\n");}return 0;
}
阅读代码,我们可以假设它会打印三次“共线”。然而实际输出如下:
不共线
不共线
共线
这是因为这些分数不能表示为双精度数,并且共线性测试将在内部计算 3x3 矩阵的行列式,该行列式接近但不等于 0,因此前两个测试的非共线性。
执行左转的点可能会发生类似的情况,但由于行列式计算期间的舍入误差,这些点似乎是共线的,或者执行右转。
如果您必须确保以完全精度解释您的数字,您可以使用执行精确谓词和提取结构的 CGAL 内核。
文件 Kernel_23/exact.cpp
#include <iostream>
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <sstream>
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
int main()
{Point_2 p(0, 0.3), q, r(2, 0.9);{q = Point_2(1, 0.6); //结果不共线std::cout << (CGAL::collinear(p,q,r) ? "collinear\n" : "not collinear\n"); }{std::istringstream input("0 0.3 1 0.6 2 0.9");input >> p >> q >> r; //结果共线std::cout << (CGAL::collinear(p,q,r) ? "collinear\n" : "not collinear\n");}{q = CGAL::midpoint(p,r); //结果共线std::cout << (CGAL::collinear(p,q,r) ? "collinear\n" : "not collinear\n");}return 0;
}
这是输出,您可能仍然会感到惊讶。
不共线
共线
共线
在第一个块中,点仍然不共线,原因很简单,您看到的文本坐标会变成浮点数。当它们转换为任意精度有理数时,它们精确地表示浮点数,但不是文本!
这在第二个块中有所不同,它对应于从文件中读取数字。然后直接从字符串构造任意精度有理数,以便它们准确地表示文本。
在第三个块中,您会看到中点构造的构造是精确的,正如内核类型的名称所暗示的那样。
在许多情况下,您将拥有“精确”的浮点数,即它们是由某些应用程序计算或从传感器获取的。它们不是字符串“0.1”或动态计算为“1.0/10.0”,而是一个全精度浮点数。如果它们被输入到不进行构造的算法,则可以使用提供精确谓词但不精确构造的内核。一个这样的例子是凸包算法,我们将在下一节中看到。输出是输入的子集,算法仅比较坐标并执行方向测试。
乍一看,执行精确谓词和构造的内核似乎是完美的选择,但性能要求或有限的内存资源使其并非如此。此外,对于许多算法来说,进行精确的构造是无关紧要的。例如,表面网格简化算法通过将边缘折叠到边缘的中点来迭代地收缩边缘。
大多数 CGAL 包都会解释它们应该使用或支持哪种内核。
2 点序列的凸包
本节中的所有示例都计算一组点的 2D 凸包。我们展示了算法将其输入作为表示一系列点的开始/结束迭代器对,并将结果(在示例中为凸包上的点)写入输出迭代器。
2.1 内置数组中的点的凸包
在第一个示例中,我们有一个由五个点组成的数组作为输入。由于这些点的凸包是输入的子集,因此提供一个用于存储具有相同大小的结果的数组是安全的。
文件 Convex_hull_2/array_convex_hull_2.cpp
#include <iostream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
int main()
{Point_2 points[5] = { Point_2(0,0), Point_2(10,0), Point_2(10,10), Point_2(6,5), Point_2(4,1) };Point_2 result[5];Point_2 *ptr = CGAL::convex_hull_2( points, points+5, result );std::cout << ptr - result << " points on the convex hull:" << std::endl;for(int i = 0; i < ptr - result; i++){std::cout << result[i] << std::endl;}return 0;
}
我们在上一节中已经看到 CGAL 附带了多个内核。由于凸包算法仅对输入点的坐标和方向进行比较,因此我们可以选择提供精确谓词但不提供精确几何构造的内核。
凸包函数采用三个参数,即输入的起始指针和结束指针,以及结果数组的起始指针。该函数将指针返回到结果数组中,正好位于最后写入的凸包点后面,因此指针差异告诉我们凸包上有多少个点。
2.2 向量中点的凸包
在第二个示例中,我们将内置数组替换为std::vector标准模板库的数组。
文件 Convex_hull_2/vector_convex_hull_2.cpp
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>
#include <vector>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef std::vector<Point_2> Points;
int main()
{Points points, result;points.push_back(Point_2(0,0));points.push_back(Point_2(10,0));points.push_back(Point_2(10,10));points.push_back(Point_2(6,5));points.push_back(Point_2(4,1));CGAL::convex_hull_2( points.begin(), points.end(), std::back_inserter(result) );std::cout << result.size() << " points on the convex hull" << std::endl;return 0;
}
我们将一些点放入向量中,调用类push_back()的方法std::vector。
然后我们调用凸包函数。前两个参数points.begin()和points.end()是迭代器,它们是指针的泛化:它们可以取消引用和递增。凸包函数是通用的,因为它将任何可以取消引用和递增的内容作为输入。
第三个参数是结果写入的位置。在前面的示例中,我们提供了指向已分配内存的指针。这种指针的泛化是输出迭代器,它允许递增并向取消引用的迭代器赋值。在此示例中,我们从一个空向量开始,该向量根据需要增长。因此,我们不能简单地传递它result.begin(),而是传递一个由辅助函数生成的输出迭代器std::back_inserter(result)。该输出迭代器在递增时不执行任何操作,而是调用result.push_back(..)赋值。
如果您了解 STL(标准模板库),那么上面的内容就很有意义,因为这就是 STL 将算法与容器解耦的方式。如果您不了解STL,您最好先熟悉一下它的基本思想。
3 关于内核和特征类
在本节中,我们将展示如何表达必须满足的要求,以便类似的函数convex_hull_2()可以与任意点类型一起使用。
如果您查看该函数convex_hull_2()和其他 2D 凸包算法的手册页,您会发现它们有两个版本。在我们到目前为止看到的示例中,该函数采用两个用于输入点范围的迭代器和一个用于写入结果的输出迭代器。第二个版本有一个附加的模板参数Traits和一个此类型的附加参数。
template<class InputIterator , class OutputIterator , class Traits >
OutputIterator
convex_hull_2(InputIterator first,InputIterator beyond,OutputIterator result,const Traits & ch_traits)
典型的凸包算法使用哪些几何基元?当然,这取决于算法,所以让我们考虑什么可能是最简单有效的算法,即所谓的“Graham/Andrew Scan”。该算法首先从左到右对点进行排序,然后通过从排序列表中逐个添加点来增量构建凸包。为此,它至少必须了解某种点类型,应该知道如何对这些点进行排序,并且必须能够评估三重点的方向。
这就是模板参数的用武之地Traits。因为ch_graham_andrew()它必须提供以下嵌套类型:
Traits::Point_2Traits::Less_xy_2Traits::Left_turn_2Traits::Equal_2
你可以猜到,Left_turn_2负责方向测试,而 则Less_xy_2用于对点进行排序。这些类型必须满足的要求已与该概念一起完整记录ConvexHullTraits_2。
这些类型被重新分组的原因很简单。另一种选择是使用相当冗长的函数模板,以及更长的函数调用。
template <class InputIterator, class OutputIterator, class Point_2, class Less_xy_2, class Left_turn_2, class Equal_2>
OutputIterator
ch_graham_andrew( InputIterator first,InputIterator beyond,OutputIterator result);
有两个明显的问题:什么可以用作此模板参数的参数?为什么我们有模板参数?
为了回答第一个问题,CGAL概念的任何Kernel模型都提供了该概念所需的内容ConvexHullTraits_2
至于第二个问题,考虑一个我们想要计算投影到平面上的 3D 点的凸包的应用程序yz。使用该类Projection_traits_yz_3是对前面示例的一个小修改。
文件 Convex_hull_2/convex_hull_yz.cpp
#include <iostream>
#include <iterator>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Projection_traits_yz_3.h>
#include <CGAL/convex_hull_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K3;
typedef CGAL::Projection_traits_yz_3<K3> K;
typedef K::Point_2 Point_2;
int main()
{std::istream_iterator< Point_2 > input_begin( std::cin );std::istream_iterator< Point_2 > input_end;std::ostream_iterator< Point_2 > output( std::cout, "\n" );CGAL::convex_hull_2( input_begin, input_end, output, K() );return 0;
}
另一个示例是关于用户定义的点类型,或来自 CGAL 之外的第三方库的点类型。将点类型与该点类型所需的谓词放在类的范围内,您就可以convex_hull_2()使用这些点来运行。
最后,让我们解释一下为什么将一个traits对象传递给凸包函数?它将允许使用更通用的投影特征对象来存储状态,例如,如果投影平面由方向给出,则该方向在类中是硬连线的Projection_traits_yz_3。
4 概念和模型
在上一节中,我们写道:CGAL概念的任何**模型都提供了该概念所需的内容。 Kernel``ConvexHullTraits_2
概念是对类型的一组要求,即它具有某些嵌套类型、某些成员函数或带有某些以该类型为基础的自由函数*。**概念的模型*是满足概念要求的类。
我们来看看下面的函数。
template <typename T>
T
duplicate(T t)
{return t;
}
如果你想用一个类来实例化这个函数C,这个类至少必须提供一个复制构造函数,我们说这个类C必须是一个模型CopyConstructible。单例类不能满足此要求。
另一个例子是函数:
template <typename T>
T& std::min(const T& a, const T& b)
{return (a<b)?a:b;
}
operator<(..)仅当为用作 as 的类型定义时,此函数才会编译T,并且我们说该类型必须是LessThanComparable的模型。
具有所需自由函数的概念的一个示例是HalfedgeListGraphCGAL 包CGAL 和 Boost Graph Library。为了成为HalfedgeListGraph类的模型G,必须有全局函数halfedges(const G&)等。
具有所需特征类的概念的一个示例是InputIterator。对于模型来说,InputIterator类的专门化std::iterator_traits必须存在(或者通用模板必须适用)。
5 进一步阅读
我们还推荐 Addison-Wesley 的 Nicolai M. Josuttis 所著的标准教科书“The C++ Standard Library, A Tutorial and Reference”,或 Matthew H. Austern 所著的“Generic Planning and the STL”,介绍 STL 及其概念和概念。楷模。
CGAL 的其他资源包括教程的其余部分以及https://www.cgal.org/上的用户支持页面。
原文链接:1. cgal在ubuntu下的安装及Hello World的测试_cgal ubuntu-CSDN博客
相关文章:
CGAL在ubuntu下的安装及Hello World的测试
ubuntu下的安装 CGAL安装 参考地址:https://doc.cgal.org/latest/Manual/usage.html 在ubuntu下安装: sudo apt-get install libcgal-dev 安装后的路径: 注意安装这个步骤安装后,boost,CGAL,gmp,mpfr头文件都在/usr/include目录下。 boost,gmp,mpfr库文件都在/…...
VIM命令常用
一、启动vim 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并创建名为filename的文件 二、文件命令 打开单个文件vim file同时打开多个文件vim file1 …...
STM32单片机实战开发笔记-I2C通讯总线【wulianjishu666】
嵌入式单片机开发实战例程合集: 链接:https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码:28ab I2C模块测试 功能描述 I2C总线接口连接微控制器和串行I2C总线。它提供多主机功能,控制所有I2C总线特定的时序&am…...
区块链 | NFT 水印:Review on Watermarking Techniques(一)
🍍原文:Review on Watermarking Techniques Aiming Authentication of Digital Image Artistic Works Minted as NFTs into Blockchains 1 应用于 NFT 的水印技术 常见的水印技术类型可以分为: 可见 v i s i b l e \mathsf{visible} visi…...
Python设计模式 - 单例模式
定义 单例模式是一种创建型设计模式, 其主要目的是确保一个类只有一个实例, 并提供一个全局访问点来访问该实例。 结构 应用场景 资源管理:当需要共享某个资源时,例如数据库连接、线程池、日志对象等,可以使用单例模…...
AI日报:干翻AI PC!苹果M4芯片首发;GoEnhance可生成粘土风格视频;DeepSeek-V2模型已在魔搭社区开源
欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南,每天我们为你呈现AI领域的热点内容,聚焦开发者,助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解:AIbase - 智能匹配最适合您的AI产品和网站 1、干翻AI …...
cmake进阶:目标属性
一. 简介 前面学习了 cmake 的一些目录属性,本文来学习 cmake的一些 目标属性。 目标属性,顾名思义就是目标对应的属性。 二. cmake进阶:目标属性 目标属性,顾名思义就是目标对应的属性。 cmake的所有目标属性可以通过如下网址…...
uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件
前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…...
恢复数据,电脑数据恢复详细操作指南(4个方法)
“我经常会把很多重要的文件都保存在电脑上,但今天在清理电脑时好像误删了一些数据,有没有比较好用的数据恢复方法可以分享一下呢?请大家给我推荐几个吧!” 随着电脑的普及,我们越来越多地将重要数据存储在电脑中。然而…...
make SGX_MODE=SW
make SGX_MODESW...
【毕业设计】基于微信小程序的校园快递平台系统设计与实现
1.项目介绍 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统校园快递平台系统信息管理难度大,容错率…...
SWAT模型【建模方法、实例应用、高级进阶技能】实践
第一部分:SWAT模型实践部分 一、SWAT模型及应用介绍 1.1 面源污染概要 1.2 SWAT模型及应用 1.3 SWAT模型原理 1.4 SWAT模型输入文件 1.5 ArcGIS与SWAT关系 二、SWAT模型中GIS必备技术 2.1 GIS软件平台 2.2 ArcGIS10.6安装和注意事项 2.3 ArcGIS入门 2.…...
远动通讯屏功能和作用
远动通讯屏功能和作用 首先大家要先了解,什么叫远动通讯?远动通讯是电力系统指用于远程通信和远程控制的设备。它主要采集电发场站的电气运行参数与远程调度监控中心进行数据交互,并接收调度中心远程的指令控制。提高电力系统的运行效率和可靠…...
Dashboard 安装部署
Dashboard 安装部署 Dashboard 安装部署 一:下载 二:部署步骤 1.镜像下载及导入 国内直接拉外网镜像会失败,可在境外下载镜像 查看 deployment 里的镜像版本 Dashboard Deploymentcontainers:- name: kubernetes-dashboardimage: k8s.g…...
idea Maven 插件 项目多环境打包配置
背景 不同环境的配置文件不一样,打包方式也有差异 1. 准备配置文件 这里 local 为本地开发环境 可改为 dev 名称自定义 test 为测试环境 prod 为生产环境 根据项目业务自行定义 application.yml 配置: spring:profiles:#对应pom中的配置active: spring.…...
密室逃脱游戏-第12届蓝桥杯省赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第58讲。 密室逃脱游戏&…...
ES6-自学01
调用方法读取文件:如果失败就throw抛出err,成功则抛出data 2.使用promise封装,如果失败就改变状态为 reject(err) 如果成功就 resolve(返回成功的值) ,然后then,就可以获取返回的值,值toString()方法来把…...
PyQt5批量生成Checkbox及批量检查Checkbox的勾选状态
批量生成Checkbox并添加到TableWidget中 for i in range(10):checkbox_i QCheckBox(fCheckbox_{i}) # 生成Checkbox并命名为Checkbox_iself.ui_1.tableWidget_1.setCellWidget(i,1,checkbox_i) 批量检查勾选状态 # 批量生成Checkbox并存入列表 list_Checkbox_1 [] for …...
如何获得一个Oracle 23ai数据库(Virtual Appliance)
准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 方法包括3种,本文介绍第1种: Virtual ApplianceRPM安装Docker 从此处下载虚拟机。 可以看到虚拟机需要4G内…...
跟TED演讲学英文:What moral decisions should driverless cars make by Iyad Rahwan
What moral decisions should driverless cars make? Link: https://www.ted.com/talks/iyad_rahwan_what_moral_decisions_should_driverless_cars_make Speaker: Iyad Rahwan Date: September 2016 文章目录 What moral decisions should driverless cars make?Introduct…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
