文章目录

  • 1 CGAL创建点云
    • 1.1 insert方式
    • 1.2 迭代器方式
  • 2 CGAL读点云
    • 2.1 读取XYZ点云
    • 2.2 读取PLY点云
    • 2.3 ifstream读取XYZ \ PLY点云
  • 3 CGAL输出点坐标
    • 3.1 输出点云所有坐标
    • 3.2 输出某一点的坐标
    • 3.3 输出XYZ坐标
  • 4 CGAL保存点云(XYZ | PLY)
  • 5 添加法向量字段
    • 5.1 在已有点上添加法向量信息
    • 5.2 添加新的 XYZ + Normal
  • 6 删除XYZ外的属性字段,只保留XYZ

1 CGAL创建点云

1.1 insert方式

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{Point_set point_set;       //创建一个三维点云容器//insert方式插入每一点坐标point_set.insert(Point(1, 2, 3));point_set.insert(Point(4, 5, 6));point_set.insert(Point(7, 8, 9));cout << "->点云的点数为:" << point_set.size() << endl;return 0;
}

输出结果:

->点云的点数为:3

1.2 迭代器方式

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{Point_set point_set;                           //创建一个三维点云容器//迭代器方式插入每一点坐标point_set.resize(3);                          //设置容器大小Point_set::iterator it = point_set.begin();        //设置迭代器初始位置point_set.point(*it + 0) = Point(1, 2, 3);point_set.point(*it + 1) = Point(4, 5, 6);point_set.point(*it + 2) = Point(7, 8, 9);cout << "->点云的点数为:" << point_set.size() << endl;return 0;
}

输出结果:

->点云的点数为:3

2 CGAL读点云

2.1 读取XYZ点云

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{Point_set point_set;       //创建一个三维点云容器if (!CGAL::IO::read_XYZ("oni.xyz", point_set)){cerr << "\a->点云文件不存在!\n" << endl;return -1;}cout << "->加载点云的点数:" << point_set.size() << endl;return 0;
}

输出结果:

->加载点云的点数:1435

2.2 读取PLY点云

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{Point_set point_set;       //创建一个三维点云容器if (!CGAL::IO::read_PLY("oni.ply", point_set)){cerr << "\a->点云文件不存在!\n" << endl;return -1;}cout << "->加载点云的点数:" << point_set.size() << endl;return 0;
}

输出结果:

->加载点云的点数:1435

2.3 ifstream读取XYZ \ PLY点云

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{//--------- 读取XYZ点云 ----------Point_set point_set_xyz;     //创建一个三维XYZ点云容器ifstream ifs_xyz("oni.xyz", std::ios_base::binary);if (!ifs_xyz){cerr << "\a->点云文件不存在!\n" << endl;return -1;}ifs_xyz >> point_set_xyz;ifs_xyz.close();cout << "->加载XYZ点云的点数:" << point_set_xyz.size() << endl;//--------- 读取PLY点云 ----------Point_set point_set_ply;       //创建一个三维PLY点云容器ifstream ifs_ply("oni.ply", std::ios_base::binary);if (!ifs_ply){cerr << "\a->点云文件不存在!\n" << endl;return -1;}ifs_ply >> point_set_ply;ifs_ply.close();cout << "->加载PLY点云的点数:" << point_set_ply.size() << endl;return 0;
}

输出结果:

->加载XYZ点云的点数:1435
->加载PLY点云的点数:1435

3 CGAL输出点坐标

CGAL采用迭代器的方式输出点云坐标。

3.1 输出点云所有坐标

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{//-------------------- 创建点云 --------------------Point_set point_set;       //创建一个三维点云容器//迭代器方式插入每一点坐标point_set.resize(5);                          //设置容器大小Point_set::iterator it = point_set.begin();        //设置迭代器初始位置point_set.point(*it + 0) = Point(1, 2, 3);point_set.point(*it + 1) = Point(4, 5, 6);point_set.point(*it + 2) = Point(7, 8, 9);cout << "->点云的点数为:" << point_set.size() << endl;//==================== 创建点云 ====================//-------------------- 输出坐标 --------------------for (Point_set::iterator it = point_set.begin(); it != point_set.end(); ++it){cout << point_set.point(*it) << endl;}//==================== 输出坐标 ====================return 0;
}

输出结果:

->点云的点数为:5
1 2 3
4 5 6
7 8 9
0 0 0
0 0 0

3.2 输出某一点的坐标

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{//-------------------- 创建点云 --------------------Point_set point_set;       //创建一个三维点云容器//迭代器方式插入每一点坐标point_set.resize(5);                          //设置容器大小Point_set::iterator it = point_set.begin();        //设置迭代器初始位置point_set.point(*it + 0) = Point(1, 2, 3);point_set.point(*it + 1) = Point(4, 5, 6);point_set.point(*it + 2) = Point(7, 8, 9);cout << "->点云的点数为:" << point_set.size() << endl;//==================== 创建点云 ====================//----------------- 输出某一点坐标 ------------------int i = 1;cout << "->第" << i + 1 << "个点的坐标为:" << point_set.point(*it + i) << endl;//================= 输出某一点坐标 ==================return 0;
}

输出结果:

->点云的点数为:5
->第2个点的坐标为:4 5 6

3.3 输出XYZ坐标

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{//-------------------- 创建点云 --------------------Point_set point_set;       //创建一个三维点云容器//insert方式插入每一点坐标point_set.insert(Point(1, 2, 3));point_set.insert(Point(4, 5, 6));point_set.insert(Point(7, 8, 9));cout << "->点云的点数为:" << point_set.size() << endl;//==================== 创建点云 ====================//------------------ 输出XYZ坐标 -------------------for (Point_set::iterator it = point_set.begin(); it != point_set.end(); ++it){cout << "第" << *it + 1 << "个点坐标:" << point_set.point(*it) << endl;cout << "    x:" << point_set.point(*it)[0]<< " y:" << point_set.point(*it)[1]<< " z:" << point_set.point(*it)[2]<< endl;}//================== 输出XYZ坐标 ===================return 0;
}

输出结果:

->点云的点数为:3
第1个点坐标:1 2 3x:1 y:2 z:3
第2个点坐标:4 5 6x:4 y:5 z:6
第3个点坐标:7 8 9x:7 y:8 z:9

4 CGAL保存点云(XYZ | PLY)

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;int main()
{//-------------------- 创建点云 --------------------Point_set point_set;       //创建一个三维点云容器//insert方式插入每一点坐标point_set.insert(Point(1, 2, 3));point_set.insert(Point(4, 5, 6));point_set.insert(Point(7, 8, 9));cout << "->点云的点数为:" << point_set.size() << endl;//==================== 创建点云 ====================//------------------ 保存XYZ点云 ------------------CGAL::IO::write_XYZ("write_XYZ.xyz", point_set);//================== 保存XYZ点云 ==================//------------------ 保存PLY点云 ------------------CGAL::IO::write_PLY("write_PLY.ply", point_set);//================== 保存PLY点云 ==================return 0;
}

输出结果:

5 添加法向量字段

5.1 在已有点上添加法向量信息

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef Kernel::Vector_3 Vector;            //用于添加法向量
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;//打印点云字段信息
void print_point_set(const Point_set &point_set)
{if (point_set.has_normal_map()){for (Point_set::const_iterator it = point_set.begin(); it != point_set.end(); ++it){cout << "第" << *it + 1 << "个点坐标:" << point_set.point(*it)<< ",法向量为:" << point_set.normal(*it)<< endl;}}else{for (Point_set::const_iterator it = point_set.begin(); it != point_set.end(); ++it){cout << "第" << *it + 1 << "个点坐标:" << point_set.point(*it) << endl;}}
}int main()
{//-------------------- 创建点云 --------------------Point_set point_set;       //创建一个三维点云容器//insert方式插入每一点坐标point_set.insert(Point(1, 2, 3));point_set.insert(Point(4, 5, 6));point_set.insert(Point(7, 8, 9));print_point_set(point_set);//==================== 创建点云 ====================//----------------- 添加法向量字段 -----------------point_set.add_normal_map();     //添加法向量,默认为(0,0,0)print_point_set(point_set);//================= 添加法向量字段 =================//----------------- 法向量字段赋值 -----------------Point_set::iterator it_n = point_set.begin();point_set.normal(*(it_n++)) = Vector(2.5, 2.5, 0.6);point_set.normal(*(it_n++)) = Vector(0.5, 1.7, 0.9);point_set.normal(*(it_n++)) = Vector(0.9, 1.8, 1.9);print_point_set(point_set);//================= 法向量字段赋值 =================return 0;
}

输出结果:

第1个点坐标:1 2 3
第2个点坐标:4 5 6
第3个点坐标:7 8 9
第1个点坐标:1 2 3,法向量为:0 0 0
第2个点坐标:4 5 6,法向量为:0 0 0
第3个点坐标:7 8 9,法向量为:0 0 0
第1个点坐标:1 2 3,法向量为:2.5 2.5 0.6
第2个点坐标:4 5 6,法向量为:0.5 1.7 0.9
第3个点坐标:7 8 9,法向量为:0.9 1.8 1.9

5.2 添加新的 XYZ + Normal

代码:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef Kernel::Vector_3 Vector;            //用于添加法向量
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;//打印点云字段信息
void print_point_set(const Point_set &point_set)
{if (point_set.has_normal_map()){for (Point_set::const_iterator it = point_set.begin(); it != point_set.end(); ++it){cout << "第" << *it + 1 << "个点坐标:" << point_set.point(*it)<< ",法向量为:" << point_set.normal(*it)<< endl;}}else{for (Point_set::const_iterator it = point_set.begin(); it != point_set.end(); ++it){cout << "第" << *it + 1 << "个点坐标:" << point_set.point(*it) << endl;}}
}int main()
{//-------------------- 创建点云 --------------------Point_set point_set;       //创建一个三维点云容器//insert方式插入每一点坐标point_set.insert(Point(1, 2, 3));point_set.insert(Point(4, 5, 6));point_set.insert(Point(7, 8, 9));cout << "->创建点云:" << endl;print_point_set(point_set);//==================== 创建点云 ====================//----------------- 添加法向量字段 -----------------point_set.add_normal_map();       //添加法向量,默认为(0,0,0)cout << "->添加法向量字段:" << endl;print_point_set(point_set);//================= 添加法向量字段 =================//----------------- 法向量字段赋值 -----------------Point_set::iterator it_n = point_set.begin();point_set.normal(*(it_n++)) = Vector(2.5, 2.5, 0.6);point_set.normal(*(it_n++)) = Vector(0.5, 1.7, 0.9);point_set.normal(*(it_n++)) = Vector(0.9, 1.8, 1.9);cout << "->法向量字段赋值:" << endl;print_point_set(point_set);//================= 法向量字段赋值 =================//----------------- 添加XYZ+Normal -----------------///方式1:point_set.insert(Point(10, 11, 12), Vector(4, 5, 6));cout << "->添加XYZ+Normal方式1:" << endl;print_point_set(point_set);///方式2:Point_set::iterator new_item = point_set.insert(Point(13, 14, 15));point_set.normal(*new_item) = Vector(7, 8, 9);cout << "->添加XYZ+Normal方式2:" << endl;print_point_set(point_set);//================= 删除XYZ外的属性 =================return 0;
}

输出结果:

->创建点云:
第1个点坐标:1 2 3
第2个点坐标:4 5 6
第3个点坐标:7 8 9
->添加法向量字段:
第1个点坐标:1 2 3,法向量为:0 0 0
第2个点坐标:4 5 6,法向量为:0 0 0
第3个点坐标:7 8 9,法向量为:0 0 0
->法向量字段赋值:
第1个点坐标:1 2 3,法向量为:2.5 2.5 0.6
第2个点坐标:4 5 6,法向量为:0.5 1.7 0.9
第3个点坐标:7 8 9,法向量为:0.9 1.8 1.9
->添加XYZ+Normal方式1:
第1个点坐标:1 2 3,法向量为:2.5 2.5 0.6
第2个点坐标:4 5 6,法向量为:0.5 1.7 0.9
第3个点坐标:7 8 9,法向量为:0.9 1.8 1.9
第4个点坐标:10 11 12,法向量为:4 5 6
->添加XYZ+Normal方式2:
第1个点坐标:1 2 3,法向量为:2.5 2.5 0.6
第2个点坐标:4 5 6,法向量为:0.5 1.7 0.9
第3个点坐标:7 8 9,法向量为:0.9 1.8 1.9
第4个点坐标:10 11 12,法向量为:4 5 6
第5个点坐标:13 14 15,法向量为:7 8 9

6 删除XYZ外的属性字段,只保留XYZ

在上一节代码的基础上,最后面添加以下代码:

point_set.clear_properties();

完整代码如下:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Point_set_3.h>typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;              //三维点(double类型)
typedef Kernel::Vector_3 Vector;            //用于添加法向量
typedef CGAL::Point_set_3<Point> Point_set;   //三维点云using namespace std;//打印点云字段信息
void print_point_set(const Point_set &point_set)
{if (point_set.has_normal_map()){for (Point_set::const_iterator it = point_set.begin(); it != point_set.end(); ++it){cout << "第" << *it + 1 << "个点坐标:" << point_set.point(*it)<< ",法向量为:" << point_set.normal(*it)<< endl;}}else{for (Point_set::const_iterator it = point_set.begin(); it != point_set.end(); ++it){cout << "第" << *it + 1 << "个点坐标:" << point_set.point(*it) << endl;}}
}int main()
{//-------------------- 创建点云 --------------------Point_set point_set;       //创建一个三维点云容器//insert方式插入每一点坐标point_set.insert(Point(1, 2, 3));point_set.insert(Point(4, 5, 6));point_set.insert(Point(7, 8, 9));cout << "->创建点云:" << endl;print_point_set(point_set);//==================== 创建点云 ====================//----------------- 添加法向量字段 -----------------point_set.add_normal_map();       //添加法向量,默认为(0,0,0)cout << "->添加法向量字段:" << endl;print_point_set(point_set);//================= 添加法向量字段 =================//----------------- 法向量字段赋值 -----------------Point_set::iterator it_n = point_set.begin();point_set.normal(*(it_n++)) = Vector(2.5, 2.5, 0.6);point_set.normal(*(it_n++)) = Vector(0.5, 1.7, 0.9);point_set.normal(*(it_n++)) = Vector(0.9, 1.8, 1.9);cout << "->法向量字段赋值:" << endl;print_point_set(point_set);//================= 法向量字段赋值 =================//----------------- 添加XYZ+Normal -----------------///方式1:point_set.insert(Point(10, 11, 12), Vector(4, 5, 6));cout << "->添加XYZ+Normal方式1:" << endl;print_point_set(point_set);///方式2:Point_set::iterator new_item = point_set.insert(Point(13, 14, 15));point_set.normal(*new_item) = Vector(7, 8, 9);cout << "->添加XYZ+Normal方式2:" << endl;print_point_set(point_set);//================= 添加XYZ+Normal =================//----------------- 删除XYZ外的属性 -----------------point_set.clear_properties();cout << "->删除XYZ外的属性:" << endl;print_point_set(point_set);//================= 删除XYZ外的属性 =================return 0;
}

输出结果:

->创建点云:
第1个点坐标:1 2 3
第2个点坐标:4 5 6
第3个点坐标:7 8 9
->添加法向量字段:
第1个点坐标:1 2 3,法向量为:0 0 0
第2个点坐标:4 5 6,法向量为:0 0 0
第3个点坐标:7 8 9,法向量为:0 0 0
->法向量字段赋值:
第1个点坐标:1 2 3,法向量为:2.5 2.5 0.6
第2个点坐标:4 5 6,法向量为:0.5 1.7 0.9
第3个点坐标:7 8 9,法向量为:0.9 1.8 1.9
->添加XYZ+Normal方式1:
第1个点坐标:1 2 3,法向量为:2.5 2.5 0.6
第2个点坐标:4 5 6,法向量为:0.5 1.7 0.9
第3个点坐标:7 8 9,法向量为:0.9 1.8 1.9
第4个点坐标:10 11 12,法向量为:4 5 6
->添加XYZ+Normal方式2:
第1个点坐标:1 2 3,法向量为:2.5 2.5 0.6
第2个点坐标:4 5 6,法向量为:0.5 1.7 0.9
第3个点坐标:7 8 9,法向量为:0.9 1.8 1.9
第4个点坐标:10 11 12,法向量为:4 5 6
第5个点坐标:13 14 15,法向量为:7 8 9
->删除XYZ外的属性:
第1个点坐标:1 2 3
第2个点坐标:4 5 6
第3个点坐标:7 8 9
第4个点坐标:10 11 12
第5个点坐标:13 14 15

CGAL学习之路(三):CGAL读写点云相关推荐

  1. python学习之路:python连接阿里云ODPS

    python学习之路:python连接阿里云ODPS 前言 本人最近在学习使用ODPS,希望把学习过程记录下来,方便自己查阅. 1.安装ODPS pip install ODPS 2.连接阿里云odp ...

  2. Redis——学习之路三(初识redis config配置)

    我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. 我们就 ...

  3. typescript学习之路(三) —— ts定义类的方法(包含es5以及es6的定义类)

    提起类,不得不说一下,强类型编程语言,如php,java,c++等都有类的概念.而js作为一门弱类型语言,是没有类这个概念的,虽然也能模拟类的实现,但总归不是类.so,ts也只是模拟类而已,使得更贴切 ...

  4. 函数式编程学习之路(三)

    入门: 函数式编程之艰难,在于这玩意更接近数学,就是数学之"用",大牛们在云端,玩纯数学去了,弄出一堆公式及概念,码农们爬在地上,辛苦耕耘,要的是看得见摸得着的,函数式编程就是要打 ...

  5. ZYNQ学习之路(三):自定义IP实现PL处理PS写入BRAM的数据

    目录 一.实验简介 二.vivado部分处理 三.SDK编程 四.实验测试 五.总结 一.实验简介 ZYNQ系列嵌入式FPGA可以使PS将数据写入PL部分BRAM,PL可以将数据读取后再重新写入BRA ...

  6. Qt学习之路(56): 二进制文件读写

    今天开始进入 Qt 的另一个部分:文件读写,也就是 IO.文件读写在很多应用程序中都是需要的.Qt 通过 QIODevice 提供了IO的抽象,这种设备(device)具有读写字节块的能力.常用的IO ...

  7. Cocos2d学习之路三(使用Zwoptex创建精灵表单和CCAnimate动画)

    创建精灵表单: 创建动画先要把图片整合到一个图片上然后生成plist文件: 方法下载Zwoptex软件:http://www.zwopple.com/zwoptex/ 然后打开选择 create ne ...

  8. 学习之路三十一:Varchar和NVarchar的理解

    前段时间在测试的时候发现了一个问题,看过Log之后发现在插入数据到数据库的时候发生异常了! 原因是由于插入的字符串太长,项目中的用到的类型是NVARCHAR,下面就是对它们的理解: 1.VARCHAR ...

  9. MongoDB学习之路(三)

    数据库 一个MongoDB可以建立多个数据库. MongoDB的默认数据库为"db",该数据库存储在data目录中. MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自 ...

  10. Object-c学习之路三(@class与#import的区别)

    //@class只是为了声明B是一个类  当两个类相互包含的时候#import是做不到的 //一般在.h文件中用@class声明一个类成员 在..m文件中具体用到时才用#import应用 //二者区别 ...

最新文章

  1. 在html中三个图片切换,轻松搞定网页中的图片切换
  2. i12蓝牙耳机使用说明书图片_飞利浦SHB4385 BASS+无线蓝牙耳机晒单 使用体验
  3. 【报告分享】新基建专题报告:5g和数据中心的投资机会分析.pdf(附下载链接)...
  4. 缺陷检测算法matlab,MATLAB 基于模板匹配的玻璃瓶口缺陷检测
  5. 2018阿里-研发工程师JAVA Software Engineer, Java
  6. 知识改变命运 股市改变人生
  7. 大数据采集与预处理技术
  8. python网页制作web_python web麻瓜编程
  9. PhotoShop中批量导出图片
  10. scanf 详解 - 你所不知道的scanf用法
  11. 1999-2018年地级市经济增长数据(GDP、人均GDP、各产业产值占比等)
  12. UI控件和代理为什么使用weak
  13. gcc 中-O1 -O2 -O3 优化的原理
  14. ps4 优酷 html5,ps4-hen-vtx/index.html at master · xvortex/ps4-hen-vtx · GitHub
  15. STM32F103ZE驱动PMW3901光流模块
  16. Nexus 5设备调试
  17. android 逆向ida,浅谈安卓逆向协议(四)- ida pro - 小红书
  18. 【随手记】有趣的面试题 —三人三鬼过河
  19. [excel]收藏夹-遇过问题的解决方法总览
  20. mysqlbinlog如何恢复误删的数据

热门文章

  1. 3D游戏编程——游戏的本质
  2. 【HUSTOJ】1050: 字符图形6-星号倒三角
  3. win10登陆界面如何截屏
  4. 2014_hitcon_stkof学习
  5. FastDFS安装手册
  6. 24小时改变你的人生 (1至12小时)很好的书,推荐大家有时间在网上看看。
  7. python泰坦尼克号数据预测_Python机器学习预测泰坦尼克号乘客生存率(kaggle项目)...
  8. linux每个phy一个接口,mdio
  9. FPGA 20个例程篇:12.千兆网口实现MDIO接口读写
  10. 学术会议演讲视频录制全方位指南