boost Geometry

boost::Geometry

boost作为C++中最常用的第三方库,Geometry库里面拥有大量的开源算法。

函数作用
get获取几何图形(通常为点)的坐标值
get (with index)获取框或段的坐标值
set设置几何图形(通常为点)的坐标值
set (with index)设置Box / Segment的坐标值
exterior_ring获取多边形的外接多边形
interior_rings获取多边形的内接多边形
bg::model::polygon<point> poly;
bg::exterior_ring(poly) = boost::assign::tuple_list_of(0, 0)(0, 3)(3, 3)(3, 0)(0, 0);bg::model::polygon<point> poly;
bg::interior_rings(poly) = boost::assign::tuple_list_of(0, 0)(0, 3)(3, 3)(3, 0)(0, 0);

Boost.Array:适用于 Boost.Geometry中不同的点类型
Boost.Fusion:自定义不同的点的结构并适配 Boost.Geometry点的处理方法,因此,可以调用许多Boost.Geometry算法
Boost.Tuple:组成的点集也可以使用算术运算,元素可以用作 Boost.Geometry 内部的点

Boost.Polygon

函数作用
point_dataBoost.Polygon点类型(boost::polygon::point_data)
rectangle_dataBoost.Polygon矩形类型
polygon_dataBoost.Polygon多边形类型
polygon_with_holes_dataBoost.Polygon多边形类型

Boost.Range

函数作用
filtered过滤不符合条件的数据
reversed反转数据
sliced指定在数据中切出一定部分的数据
strided指定在数据以n为步长间接取值

area

函数作用
area计算几何图形的面积
area (with strategy)使用指定的策略计算几何图形的面积

assign

函数作用
assign将一个几何图形指定给另一个几何图元
assign_inverse利用assign_ inverse和expand方便地确定两点的边界三维框
assign_points为 linestring, ring 或 polygon指定一系列点
assign_values为几何图形指定两个坐标(通常为二维点,三维点和四维点这三种情况)
assign_zeroassign_zero函数初始化坐标为零的二维或三维点或框
append将一个或多个点附加到linestring, ring, polygon, multi-geometry中

buffer

自由函数缓冲区计算几何体的缓冲区(多边形是距离几何体指定最大距离内的空间点集集合)。下图显示了策略在生成的缓冲区中的作用

return_buffer
return_ buffer函数计算几何体的缓冲区(多边形是距离几何体指定最大距离内的空间点集集合)。这个带有return_前缀的版本返回缓冲区,因此必须在调用中指定模板参数。这个个人感觉功能性没有buffer好

centroid

centroid
使用指定的策略计算几何图形的质心

return_centroid
使用指定的策略计算几何图形的质心。这两个求质心的方式类似。

Densify

线段插值

vector<Point2f> Densify(const Segment2f& seg, int num) {CHECK_GT(num, 0);CHECK(!bg::intersects(seg.s, seg.e));vector<Point2f> pts{seg.s};pts.reserve(num);boost::geometry::line_interpolate(seg, bg::length(seg) / num, pts);pts.emplace_back(seg.e);return pts;
}

部分函数

函数作用
clear清除 linestring, ring 或者 polygon (exterior+interiors) 和 multi*
convert将一个几何图形转换为另一个几何图元
convex_hull计算几何体的凸包
correct纠正几何图形:所有相对于其预期方向错误定向的环都将反转。对于所有没有闭点且按其应有类型键入的环,将附加第一个点。也可以校正框。
covered_by使用指定的策略检查第一个几何图形是否位于第二个几何图形的内部或边界上
crosses检查两个几何图形是否相交
densify使用指定的策略加密几何体
difference计算两种几何图形的差异.通过差分计算两种几何的空间集合论差分
discrete_frechet_distance使用指定的策略计算两个几何图形之间的离散Frechet距离(目前适用于LineString)
discrete_hausdorff_distance使用指定的策略计算两个几何图形之间的离散Hausdorff距离(目前适用于 LineString-LineString, MultiPoint-MultiPoint, Point-MultiPoint, MultiLineString-MultiLineString)
disjoint检查两个几何图形是否不相交
equals检查几何体在空间上是否相等
expand使用长方体来框选多个几何图形(长方体、点)的边界框
intersection计算两个几何图形的交点
intersects检查几何图形是否至少有一个交点(相交或自相切)
is_empty检查几何图形是否为空集
is_simple检查几何图形是否简单
is_valid检查几何图形是否有效(在OGC意义上)
length函数长度计算几何体的长度(连续点之间的距离之和)。它使用基于几何体坐标系的默认策略。
line_interpolate返回沿LineString方向插值的一个或多个点
make构造几何图形
make_inverse用逆无穷坐标构造一个长方体
make_zero构造一个坐标初始化为零的几何体
num_geometries计算几何图形的几何图形数
num_interior_rings计算几何图形的内解多边形数
num_points计算几何图形的点数
num_segments计算几何图形的线段数(segments)
overlaps检查两个几何图形是否重叠
perimeter计算几何图形的周长
relate检查由遮罩定义的一对几何图形之间的关系
relation计算DE-9IM中定义的一对几何图形之间的关系
reverse反转几何图形中的点
simplify简化几何图形
sym_difference计算两种几何体的对称差
touches检查几何图形是否至少有一个接触点(自相切)
transform使用策略从一个几何图形转换到另一个几何图元
union_组合两个相互关联的几何图形
unique计算几何图形的最小集
within检查第一个几何体是否完全位于第二个几何体内部

distance

comparable_distance
使用指定的策略计算两个几何图形的可比距离测量值,点在多边形内部,可以使用comparable_distance

double cmpDst = boost::geometry::comparable_distance(segment,pt);

distance
使用指定的策略计算两个几何图形之间的距离。distance可以正确处理多边形外部的点,但是似乎将多边形视为实体。因此,多边形内的每个点到多边形的距离显然为0。

double cmpDst = boost::geometry::distance(segment,pt);

envelope

envelope
自由函数包络计算几何体的包络(也称为轴对齐边界框、aabb或最小边界矩形、mbr)

return_envelope
自由函数return_envelope计算几何体的包络(也称为轴对齐边界框、aabb或最小边界矩形、mbr)。这个带有return_前缀的版本返回信封,因此必须在调用中指定模板参数

点云处理

函数作用
add_point将一个点添加到另一个点
add_value将相同的值添加到点的每个坐标
assign_point用另一个点指定一个点
assign_value为点的每个坐标指定相同的值
cross_product计算两个向量的叉积
divide_point将一点除以另一点
divide_value将同一点的每个坐标除以一个值
dot_product计算2个矢量(点)的点积(或标量积)
multiply_point将一个点乘以另一个点
multiply_value将点的每个坐标乘以相同的值
subtract_point将一点减去另一点
subtract_value将相同的值减去点的每个坐标

常数控制

函数作用
min_corner指示要获取、设置或处理的框的最小角
max_corner指示要获取、设置或处理的框的最大角

坐标系转换

函数作用
cs::cartesian笛卡尔坐标系
cs::spherical球面(极坐标)坐标系,以度或弧度表示
cs::spherical_equatorial球面赤道坐标系,以度或弧度表示
cs::geographic地理坐标系,以度或弧度表示

核心元函数

函数作用
closure将值定义为指定几何图形类型的闭包(顺时针、逆时针)的函数
coordinate_system函数将类型定义为构成指定几何类型的点类型的坐标系(笛卡尔坐标系、球面坐标系等)
coordinate_type函数将类型定义为构成指定几何类型的点类型的坐标类型(int、float、double等)
cs_tag函数返回任意几何体的坐标系标记(cs族)
degree定义球面坐标系的平面角单位的标记。此标记指定坐标的定义单位为度(-180…180)。必须为某些坐标系指定它
dimension将值定义为构成指定几何图形类型的点类型的函数
interior_type将类型定义为指定几何类型的interior_ type(内环的容器类型)的函数
point_order将值定义为指定几何图形类型的点顺序(顺时针、逆时针)的函数
point_type将类型定义为指定几何体类型的point_ type的元函数
radian平面角单位:弧度
ring_type将类型定义为指定几何体类型的环_类型的函数
tag将类型定义为指定几何体类型的标记的函数
tag_cast标记转换,标记可以相互继承。例如,multi_ point继承multi_。通常,行为可以在不同的几何图形类型之间共享。由metafunction标记找到的标记可以转换为更基本的标记,然后由该标记分派

模型

函数作用
model::point基点类,具有以中性方式定义的坐标
model::d2::point_xy笛卡尔坐标系中的二维点
model::d3::point_xyz笛卡尔坐标系中的三维点
model::linestringlinestring(由OGC命名)是点的集合(默认为向量)
model::polygon多边形包含一个外圈和零个或多个内圈
model::multi_pointmulti_point,点的集合
model::multi_linestringmulti_line,linestring的集合
model::multi_polygonmulti_ polygon,多边形的集合
model::box类框:定义由两个描述点组成的框
model::ring环(也称为线性环)是一条不应自相交的闭合线
model::segment在几何学中,线段是由两个不同端点限定的直线的一部分,包含其端点之间直线上的每个点
model::referring_segment类段:包含两个(模板化)点引用的小类

空间索引

boost::geometry::index::rtree

函数作用
rtree()rtree的构造函数
~rtree()rtree的析构函数
operator=(rtree const &)赋值运算符
swap(rtree &)交换两个RTree的内容
insert(value_type const &)在索引中插入一个值
remove(value_type const &)从容器中删除值
query(Predicates const &, OutIter)此查询函数执行空间和k近邻搜索。它允许传递一组数据。仅当满足所有数据时才会返回值
qbegin(Predicates const &)返回指向查询范围开头的查询迭代器
qend()返回一个指向查询范围末尾的查询迭代器
begin()返回指向rtree值范围开头的迭代器
end()返回指向rtree值范围末尾的迭代器
size()返回存储值的数目
empty()查询容器是否为空
clear()删除存储在容器中的所有值
bounds()返回能够包含容器中存储的所有值的框
count(ValueOrIndexable const &)对于indexable_type,它返回可索引的值的数目等于参数。对于value_type,它返回等于参数的值的数量
parameters()返回参数
indexable_get()返回从值检索可索引的函数
value_eq()返回比较值的函数
get_allocator()返回rtree使用的分配器

R-tree parameters (boost::geometry::index)

函数作用
boost::geometry::index::linear线性r树创建算法参数
boost::geometry::index::quadratic二次r树生成算法参数
boost::geometry::index::rstarR*-树创建算法参数
boost::geometry::index::dynamic_linear线性r树创建算法参数-运行时版本
boost::geometry::index::dynamic_quadratic二次r树创建算法参数-运行时版本
boost::geometry::index::dynamic_rstarR*-树创建算法参数-运行时版本

其他函数

函数作用
boost::geometry::index::indexable从值中提取可索引的函数对象,这个是override转换
boost::geometry::index::equal_to函数对象比较值,这个是override转换
inserter(Container &)插入迭代器生成器,这个是override转换
queried(Predicates const &)查询索引适配器生成器

Predicates (boost::geometry::index)

Predicates (boost::geometry::index) 下面的这些都是与前文同名函数相同的意思,只是是适用于RTree的函数

函数
contains(Geometry const &)
covered_by(Geometry const &)
covers(Geometry const &)
disjoint(Geometry const &)
intersects(Geometry const &)
overlaps(Geometry const &)
within(Geometry const &)
satisfies(UnaryPredicate const &)
nearest(Geometry const &, unsigned)

Geometry策略方式

函数作用
strategy::area::cartesian笛卡尔面积计算
strategy::area::spherical球面面积计算
strategy::area::geographic地理区域计算
strategy::buffer::join_round让缓冲区创建圆角
strategy::buffer::join_miter让缓冲区创建锐角
strategy::buffer::end_round让缓冲区创建圆角端点
strategy::buffer::end_flat让缓冲区创建平端
strategy::buffer::distance_symmetric让缓冲区算法创建具有相同距离的缓冲区
strategy::buffer::distance_asymmetric让缓冲区是不对称
strategy::buffer::point_circle围绕点创建圆形缓冲区
strategy::buffer::point_square围绕点创建方形缓冲区
strategy::buffer::geographic_point_circle在地球上的一个点周围创建一个圆形缓冲区
strategy::buffer::side_straight让缓冲区沿线段使用直边(默认)
strategy::centroid::average质心计算取点的平均值
strategy::centroid::bashein_detmer使用Bashein/Detmer算法计算质心
strategy::convex_hull::graham_andrewGraham扫描策略计算凸包
strategy::densify::cartesian笛卡尔线段的致密化
strategy::densify::geographic地理段的致密化,对应了上文的densify方法
strategy::densify::spherical球形段的致密化,对应了上文的densify方法
strategy::distance::pythagoras计算两点之间距离的策略,对应了上文的distance方法
strategy::distance::pythagoras_box_box计算两个盒子之间距离的策略,对应了上文的distance方法
strategy::distance::pythagoras_point_box计算点与长方体之间距离的策略,对应了上文的distance方法
strategy::distance::haversine使用哈弗斯线计算完美球体上球坐标的距离
strategy::distance::projected_point点到线段的距离策略
strategy::distance::cross_track用于点到线段距离计算的策略函数
strategy::distance::cross_track_point_box用于计算点到框的距离的策略函数
strategy::line_interpolate::cartesian在笛卡尔线段上插值点,对应了上文的line_interpolate方法
strategy::line_interpolate::geographic插值地理线段上的点,对应了上文的line_interpolate方法
strategy::line_interpolate::spherical在球面段上插值点,对应了上文的line_interpolate方法
strategy::side::side_by_triangle检查点位于线段的哪一侧:线段左侧(>0),线段右侧(<0),线段上(0)
strategy::side::side_by_cross_track检查大圆线段的哪一侧有一个点位于线段左侧(>0),线段右侧(<0),线段(0)
strategy::side::spherical_side_formula检查大圆线段的哪一侧有一个点位于线段左侧(>0),线段右侧(<0),线段(0)上
strategy::side::geographic检查线段的哪一侧有一个点位于线段左侧(>0)、右侧(<0)和线段(0)上
strategy::simplify::douglas_peucker实现简化算法
strategy::transform::inverse_transformer在笛卡尔坐标系中进行逆变换的变换策略
strategy::transform::map_transformer从一个笛卡尔坐标系映射到另一个笛卡儿坐标系的转换策略
strategy::transform::rotate_transformer笛卡尔坐标系中的旋转变换策略
strategy::transform::scale_transformer笛卡尔系统中的尺度变换策略
strategy::transform::translate_transformer笛卡尔系统中的平移变换策略
strategy::transform::matrix_transformer笛卡尔系统中的仿射变换策略
strategy::within::winding在使用缠绕规则的检测范围内。根据点的坐标系选择内部使用的边策略。
strategy::within::franklin在使用交叉计数的检测范围内
strategy::within::crossings_multiply在使用交叉计数的检测范围内

示例

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/foreach.hpp>
#include <boost/assign/list_of.hpp>
namespace bg = boost::geometry;
typedef bg::model::d2::point_xy<double> Point;
typedef bg::model::segment<Point> Segment;
typedef bg::model::linestring<Point> LineString;
typedef bg::model::box<Point> Box;
typedef bg::model::ring<Point, false> Ring;
typedef bg::model::polygon<Point, false> Polygon;int main()
{Point pt0(100, 100);Point pt1(200, 200);Segment sg0(pt0, pt1);double Distance = 0;//1、点到点的距离Distance = bg::distance(pt0, pt1);  // 141.421//2、点到线段的距离,如果点到直线的垂足不在线段上,所计算的距离为(点到直线的距离、线段到垂足延长的距离之和)Distance = bg::distance(Point(200, 100), sg0);  // 70.7107Distance = bg::distance(Point(100, 0), sg0);    // 100//3、判断线段是否相交Segment sg1(Point(0, 100), Point(100, 0));Segment sg2(Point(100, 200), Point(200, 100));bool bIntersect = false;bIntersect = bg::intersects(sg0, sg1);  // 0bIntersect = bg::intersects(sg0, sg2);  // 1//4、求线段与线段的交点std::list<Point> lstPoints;bg::intersection(sg0, sg1, lstPoints);lstPoints.clear();bg::intersection(sg0, sg2, lstPoints);  // (150, 150)//5、判断box是否相交Box rc(Point(0, 0), Point(200, 200));Box rc0(Point(250, 250), Point(450, 450));Box rc1(Point(100, 100), Point(300, 300));bIntersect = bg::intersects(rc, rc0);   // 0bIntersect = bg::intersects(rc, rc1);   // 1//6、判断box是否与LineString相交LineString line0;line0.push_back(Point(10, 250));line0.push_back(Point(100, 100));line0.push_back(Point(120, -10));line0.push_back(Point(210, 200));bIntersect = bg::intersects(rc, line0);     // 1bIntersect = bg::intersects(rc0, line0);    // 0//7、求box与linestring的交点std::list<LineString> lstLines;bg::intersection(rc, line0, lstLines);  // (40, 200),(100, 100),(118.18, 0), (124, 0),(200, 176.67)//8、点是否在box内Box rc7(Point(0, 0), Point(100, 100));bool bInside = false;bInside = bg::within(Point(50, 50), rc7);   // 1bInside = bg::within(Point(0, 0), rc7);     // 0//9、判断LineString与LineString是否相交LineString line1, line2, line3;line1.push_back(Point(50, 50));line1.push_back(Point(150, 50));line1.push_back(Point(50, 200));line1.push_back(Point(150, 200));line2.push_back(Point(100, 0));line2.push_back(Point(70, 100));line2.push_back(Point(150, 210));line3.push_back(Point(200, 0));line3.push_back(Point(200, 200));bIntersect = bg::intersects(line1, line2);  // 1bIntersect = bg::intersects(line1, line3);  // 0//10、求LineString与LineString的交点lstPoints.clear();bg::intersection(line1, line2, lstPoints);  // (85, 50), (94.35, 133.48), (142.72, 200)lstPoints.clear();bg::intersection(line1, line3, lstPoints);//11、判断ring与ring是否相交Point arDPoint0[6] = {Point(0, 0), Point(100, 0), Point(200, 100), Point(100, 200), Point(0, 200), Point(0, 0)};Point arDPoint1[6] = {Point(100, 100), Point(200, 0), Point(300, 0), Point(300, 200), Point(200, 200), Point(100, 100)};Ring r0(arDPoint0, arDPoint0 + 6);Ring r1(arDPoint1, arDPoint1 + 6);bIntersect = bg::intersects(r0, r1);    // 1//12、求ring与ring的交点lstPoints.clear();bg::intersection(r0, r1, lstPoints);    // (150, 30), (150, 150)Polygon poly1;Polygon poly2;Polygon poly3;auto lstOf = boost::assign::list_of(Point(0, 0))(Point(200, 0))(Point(200, 200))(Point(0, 200))(Point(0, 0));poly1.outer().assign(lstOf.begin(), lstOf.end());lstOf = boost::assign::list_of(Point(50, 50))(Point(150, 50))(Point(150, 150))(Point(50, 150))(Point(50, 50));poly1.inners().push_back(lstOf);lstOf = boost::assign::list_of(Point(100, 0))(Point(120, 0))(Point(120, 200))(Point(100, 200))(Point(100, 0));poly2.outer().assign(lstOf.begin(), lstOf.end());lstOf = boost::assign::list_of(Point(100, 60))(Point(120, 60))(Point(120, 140))(Point(100, 140))(Point(100, 60));poly3.outer().assign(lstOf.begin(), lstOf.end());//13、判断polygon与polygon是否相交bIntersect = bg::intersects(poly1, poly2);  // 1bIntersect = bg::intersects(poly1, poly3);  // 0//14、求polygon与polygon相交的区域std::list<Polygon> lstPolygon;bg::intersection(poly1, poly2, lstPolygon);lstPolygon.clear();bg::intersection(poly1, poly3, lstPolygon);//15、判断点是否在polygon内bInside = bg::within(Point(100, 100), poly1);   // 0bInside = bg::within(Point(25, 25), poly1);     // 1return 0;
}
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/foreach.hpp>
#include <boost/assign/list_of.hpp>int main()
{typedef boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > polygon;polygon green, blue;boost::geometry::read_wkt("POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 3,5.3 2.6,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3)""(4.0 2.0, 4.2 1.4, 4.8 1.9, 4.4 2.2, 4.0 2.0))", green);boost::geometry::read_wkt("POLYGON((4.0 -0.5 , 3.5 1.0 , 2.0 1.5 , 3.5 2.0 , 4.0 3.5 , 4.5 2.0 , 6.0 1.5 , 4.5 1.0 , 4.0 -0.5))", blue);std::deque<polygon> output;boost::geometry::intersection(green, blue, output);int i = 0;std::cout << "green && blue:" << std::endl;BOOST_FOREACH(polygon const& p, output){std::cout << i++ << ": " << boost::geometry::area(p) << std::endl;  // 0: 2.50205}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104197.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/S架构学习之多进程实现TCP并发服务器

多进程实现TCP并发服务器的实现流程&#xff1a;一、自定义信号处理函数&#xff08;sig_func函数&#xff09;&#xff1a; void sig_func(int signum){wait(NULL);}wait函数: #include <sys/types.h>#include <sys/wait.h>pid_t wait(int *wstatus);/*功能&#…

Pytorch从零开始实战05

Pytorch从零开始实战——运动鞋识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——运动鞋识别环境准备数据集模型选择数据可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1cu118…

python udp 线程接受 demo

udp使用socketserver 接受简单方便 使用是python 的threading 快速构建udp 接受线程 使用 pyqt5的QThread&#xff0c;用于发现信号到ui线程&#xff0c;跟新ui 使用queue接受udp数据&#xff0c;并通过queue在 udp接受线程和数据解析线程间数据传递。 from socketserver impo…

代码混淆界面介绍

代码混淆界面介绍 代码混淆功能包括oc&#xff0c;swift&#xff0c;类和函数设置区域。其他flutter&#xff0c;混合开发的最终都会转未oc活着swift的的二进制&#xff0c;所以没有其他语言的设置。 代码混淆功能分顶部的显示控制区域&#xff1a;显示方式&#xff0c;风险等…

centos7安装db2 version11.1

centos7安装DB2 操作系统 linux centos7 DB2版本 11.1 1、取包 IBM MRS Tool 将安装包放在 /home/software 下面 mkdir -p /home/software cd /home/software wget https://iwm.dhe.ibm.com/sdfdl/v2/regs2/db2pmopn/Express-C/DB2ExpressC11/Xa.2/Xb.aA_60_-i7wWKFMFpbW1xl1…

Spark上使用pandas API快速入门

文章最前&#xff1a; 我是Octopus&#xff0c;这个名字来源于我的中文名--章鱼&#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github &#xff1b;这博客是记录我学习的点点滴滴&#xff0c;如果您对 Python、Java、AI、算法有兴趣&#xff0c;可以关注我的…

高压放大器在软体机器人领域的应用

软体机器人是一种新型机器人技术&#xff0c;与传统的硬体机器人有着很大的不同。软体机器人通常由柔软的材料制成&#xff0c;具有高度的柔韧性和灵活性&#xff0c;并且可以实现多种形状和动作。但是&#xff0c;软体机器人的发展面临很多技术挑战&#xff0c;其中之一就是控…

Java 解析 cURL(bash) 命令

解析 cURL&#xff08;bash&#xff09; 命令 1. 主要用于解析从浏览器复制来的 cURL(bash)2. 废话不多说&#xff0c;都在&#x1f37b;代码里了。参考资料 1. 主要用于解析从浏览器复制来的 cURL(bash) curl https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/…

使用PyQt5创建图片查看器应用程序

使用PyQt5创建图片查看器应用程序 作者&#xff1a;安静到无声 个人主页 在本教程中&#xff0c;我们将使用PyQt5库创建一个简单的图片查看器应用程序。这个应用程序可以显示一系列图片&#xff0c;并允许用户通过按钮切换、跳转到不同的图片。 1. 准备工作 首先&#xff0…

在 TensorFlow 中调试

如果调试是消除软件错误的过程&#xff0c;那么编程一定是添加错误的过程。Edsger Dijkstra。来自 https://www.azquotes.com/quote/561997 一、说明 在这篇文章中&#xff0c;我想谈谈 TensorFlow 中的调试。 在之前的一些帖子&#xff08;此处、此处和此处&#xff09;中&…

谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)

有一个5*5的网格&#xff0c;其中恰好有一个格子是空的&#xff0c;其他格子各有一个字母。一共有4种指令&#xff1a;A, B, L, R&#xff0c;分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指令序列&#xff08;以数字0结束&#xff09;&#xff0c;输出指…

Linux shell编程学习笔记11:关系运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算。前面几节我们研究了 Linux shell编程 中的 字符串运算 和 算术运算&#xff0c;今天我们来研究 Linux shell编程中的的关系运算。 一、关系运算符功能说明 运算符说明…

单片机常见的屏幕驱动移植

目录 一个驱动.c文件的典型模块划分&#xff08;5&#xff09; 1. Include files 2. Local type definitions (typedef) 3. Local pre-processor symbols/macros (#define) 4. Local variable definitions (static) 5. Function implementation - global (extern) and loc…

linux之/etc/skel目录

/etc/skel目录是在使用useradd添加用户时&#xff0c;一个需要用到的目录&#xff0c;该目录用来存放新建用户时需要拷贝到新建用户家目录下的文件。即&#xff1a;当我们新建新用户时&#xff0c;这个目录下的所有文件会自动被复制到新建用户的家目录下&#xff0c;默认情况下…

go语言基础之变量

目录 视频学习地址&#xff1a;Go零基础入门_在线视频教程-CSDN程序员研修院 一. 单变量声明和赋值 1、变量的声明 2、变量赋值 3、声明并赋值 二. 多变量声明和赋值 1、多变量声明 2、多变量赋值 三. 变量声明赋值的简易写法 1、单变量简易写法 2、多变量简易写法 …

DOSBox和MASM汇编开发环境搭建

DOSBox和MASM汇编开发环境搭建 1 安装DOSBox2 安装MASM3 编译测试代码4 运行测试代码5 调试测试代码 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 安装DOSBox 下载DOSBox和MASM&#xff1a;https://download.csdn.net/download/u011832525/884180…

uniapp封装loading 的动画动态加载

实现效果 html代码 <view class"loadBox" v-if"loading"><img :src"logo" class"logo"> </view> css代码 .loadBox {width: 180rpx;min-height: 180rpx;border-radius: 50%;display: flex;align-items: center;j…

【面试经典150 | 哈希表】存在重复元素 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希表方法二&#xff1a;滑动窗口 其他语言python3哈希表python3滑动窗口 写在最后 Tag 【哈希表】【滑动窗口】【数组】 题目来源 219. 存在重复元素 II 题目解读 判断在数组中有没有相同的元素小于一定的距离。 解…

Java面试题-Java核心基础-第三天(基本数据类型)

目录 一、Java的基本数据类型了解吗&#xff1f; 二、基本类型和包装类型的区别 三、包装类型的缓存机制了解吗&#xff1f; 四、自动拆箱和自动装箱了解吗&#xff1f; 五、为什么浮点数在运算的时候会有精度损失的风险&#xff1f; 六、如何解决浮点数在运算时存在的精度…

Win10 系统中用户环境变量和系统环境变量是什么作用和区别?

环境&#xff1a; Win10专业版 问题描述&#xff1a; Win10 系统中用户环境变量和系统环境变量是什么作用和区别&#xff1f; 解答&#xff1a; 在Windows 10系统中&#xff0c;用户环境变量和系统环境变量是两个不同的环境变量&#xff0c;它们具有不同的作用和区别 1.用…