C++ 杂记

应用程序内存空间(局部内存堆),程序进程结束时,会被统一都回收释放 公共内存区(全局内存堆)(写设备驱动程序时会使用),使用不当会造成内存泄漏 extern 不能修饰其他模块的静态变量 函数内用 extern 修饰的变量要么来自全局变量,要么来自本身模块的静态变量 extern 只能修饰外部变量(就近原则),不能修饰局部变量 test.cpp: #include <iostream> int etn = 3; // 全局变量 static int s_m; // 模块静态变量 void layout() { std::cout << "test.cpp\tetn=" << etn << std::endl; } another.cpp: static int etn = 4; // 模块静态变量 void myFunc(){ int etn = 5; // 局部自动变量 { extern int etn; int x = etn;// x 是 4 而不是 5 } } charTest....

August 15, 2022 · 2 min · Rick Cui

Compile FFmpeg on CentOS

0. 编译的版本 ffmpeg-4.4 nasm-2.14.02 yasm-1.3.0 H.264 H.265 fdk-aac-2.0.0 1. Get the Dependencies 需要 superuser 或者 root 用户 # yum install autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel 新建 ffmpeg_sources 文件夹,把需要的源代码都放到这个文件夹中 mkdir ~/ffmpeg_sources 新建 ffmpeg_build 文件夹,把构建的项目文件都放到这个文件夹中 mkdir ~/ffmpeg_build 新建 bin 文件夹,把编译生成的文件都放到这个文件夹中 mkdir ~/bin 2. Install NASM assembler 一些库使用的汇编程序。强烈建议这样做,否则构建可能会非常缓慢。 cd ~/ffmpeg_sources curl -O -L https://www....

August 15, 2022 · 2 min · Rick Cui

判断点是否在多边形内部

射线法:不需考虑精度误差和多边形点给出的顺序。 转角法:要求多边形是有顺序的,按照多边形顶点逆时针顺序,从 P 点到顶点 Vi 分别做连线,其中 αi 为 Vi 和 Vi+1 之间的夹角。其中 α 角度逆时针为正,顺时针为负,这样所有到顶点做连线之间夹角和为(环绕数)0,这点P在多边形外部,否则在内部。 射线法改进:针对有方向的多边形,通过判断射线穿过的边和点的位置(比如点在线的左侧为正,右侧为负),和为 0 则点在外部。 叉积法:适用凸多边形,如果一个点在多边形所有有向边的左边,那么这个点一定在多边形内部。 面积法:类似叉积法,适用凸多边形。如果点在多边形内部或者边上,那么点与多边形所有边组成的三角形面积和等于多边形面积。 参考: 详谈判断点在多边形内的七种方法(最全面) hdu1756 hrbust1429 为例

August 2, 2022 · 1 min · Rick Cui

Qt 多线程

一、注意事项: 线程处理类继承于 QObject 线程处理类对象不能有父对象 处理完成后向外发信号 即使 QThread 线程内部的处理对象运行结束了,QThread 线程对象也不会自动释放,需要手动 quit() + wait() 线程处理类对象创建成功后,需要通过 moveToThread() 函数移动到 QThread 对象中 需要通过其他线程发信号来启动另外线程中的处理类对象的处理函数 子线程中不要操作图形界面 二、connect 第五个参数的作用 指定信号和槽的连接方式:自动连接、直接连接、队列连接,多线程时才有意义,默认为 Qt::AutoConnection。 Qt::AutoConnection(自动连接):多线程时是 Qt::QueuedConnection(队列连接),单线程时是 Qt::DirectConnection(直接连接) Qt::QueuedConnection(队列连接):槽函数所在线程和信号接收者所在线程相同 Qt::DirectConnection(直接连接):槽函数所在线程和信号发送者所在线程相同 三、代码示例 线程处理类 class MyThreadPro : public QObject { Q_OBJECT public: explicit MyThreadPro(QObject *parent = nullptr); // 后台处理函数 void startProcessing(); // 是否结束标识位 void setFlag(bool b = false); signals: // 向其他线程发送信号 void myTimeout(); private: bool stopRunning; }; 主窗口类...

July 18, 2022 · 1 min · Rick Cui

OpenGL 视差贴图(Parallax Mapping)

参考: 视差贴图(Parallax Mapping)学习笔记 视差映射(Parallax Mapping) Learn about Parallax(视差贴图)

July 18, 2022 · 1 min · Rick Cui