
C++
文章平均质量分 55
ryfdizuo
腾讯专家开发工程师(T12/T4-1) Live Long And Prosper.
展开
-
skia-macos源码编译
打开out下的all xcode工程文件即可编译通过。一定要用这个选项,否则jpeg相关头文件报错。4、生成demo和xcode工程。1、下载git-hub 源码。默认Intel架构,原创 2025-02-09 09:46:34 · 459 阅读 · 0 评论 -
STL Map的使用和性能issue
C++ STL map使用避坑原创 2024-07-25 10:56:50 · 409 阅读 · 0 评论 -
C++ SDK包大小优化实践
一个成熟sdk,必然要经历 压缩包大小 / 瘦身的过程。尤其以SDK的形式接入一个第三方APP中。客户方是宿主APP,对第三方sdk会提出各种苛刻要求。如果APP是top级的,比如微信,QQ,滴滴打车,美团这类,居高临下 这类要求会更加难以回绝。原创 2020-06-28 23:07:20 · 1525 阅读 · 1 评论 -
一个简单的多叉树C++实现
一个简单的多叉树实现:利用迭代器方便地构建树,可以递归输出,前序,后序。利用栈实现输出。销毁树只能后序遍历类的定义:#include #include #include #include #include using namespace std;templateclass htree_node{public: typedef ht原创 2009-03-08 12:12:00 · 23248 阅读 · 5 评论 -
N维向量的模板实现
code:vectorBase.hpp:一些低维特化、#include using namespace std;// for any dimensions other than // specified below, this struct will// be usedtemplatestruct vector_base{ T m_data[N];}原创 2009-03-28 20:16:00 · 3141 阅读 · 0 评论 -
全局变量的处理
全局变量在程序中很难避免,一般的处理办法主要有四种:extern最常用的做法, 还是来源于c语言的习惯,第二种处理方案,一个类要使用全局变量可以作为构造函数的参数传入类中,举个例子:在做Trackball跟踪球的时候,类里面必须保持有窗口的尺寸,也就只是两个int类型的变量,完全可以作为TrackBall的构造参数传入:单件类,设计模式中的Singleton模式,类内部定义一个st原创 2009-04-12 19:15:00 · 1865 阅读 · 0 评论 -
多叉树的可视化与遍历
最近忙着做毕设,其中的骨架系统说白了就是一个多叉层次树结构,当整体框架已经差不多的时候,就一直思考着重构一下代码,因为最初只是为了实现效果,所以有很多地方的设计不是很合理。 先自己写了一个多叉树的小型库,支持用迭代器创建,递归遍历,销毁,试着增加一些其他功能,例如给前序迭代器增加了operator++,但是发现很多地方受到了node结构的限制。多叉树的node数据结构如下:class N原创 2009-04-12 20:03:00 · 14174 阅读 · 3 评论 -
CEGUI中的Sample程序库模型
CEGUI中的sample的例子给的很全。很有研究价值。而且wiki主页上的很多都是基于sample程序库的例子,所以sample库的整天框架还是有必要搞清楚的。下面是一个模型程序,不过基本上把sample的整体框架说明了:#include #include #include #include using namespace std;#define SAFE_DELET原创 2009-04-12 20:33:00 · 2758 阅读 · 2 评论 -
exit函数使用造车内存泄漏问题
使用过glut的都一定记得keyboard函数中一个最常用的响应指令:switch(key){case 27:case q:case Q: exit(0); break;} 是的,一直以来我也是这么使用的,不管写的是一个不足百行的测试例子。写大一点的库。直到前两天逛论坛,看到了一个帖子,我为之一震啊,一直以来我很自信自己的代码绝对没有内存泄漏问题。因为只原创 2009-04-12 21:18:00 · 2458 阅读 · 4 评论 -
一个四叉树的简单实现
最近利用OpenGL实现了一个简单的四叉树,对窗口进行分割。数据结构: AreaType m_bounds; rectContainer m_contents; pointerType m_nodes[4]; m_bounds是节点的矩形包围盒, m_nodes数组存储四个孩子的节点指针, m_contents存储那些不包含于四个孩子但是包含于当前节点的区域,也就是那些我们原创 2009-04-22 15:57:00 · 6972 阅读 · 3 评论 -
创建自己的dll和lib文件
经常使用到第三方库。比如:glut,freetype,sdl,大一点的有CEGUI,OSG等。这些库虽然是开源的,但是很多时候只是使用他们,一般不会去修改。使用就会涉及到三个东西:.h .lib .dll文件。主要有三种模式:.h+.lib .h+.lib+.dll.dll 第二种是最常见的,其他两种都比较少 一,下面自己实现一个dll和原创 2009-04-23 15:47:00 · 7189 阅读 · 6 评论 -
用XML文件作为多叉树的脚本
现在很多软件配置,包括游戏UI的配置文件都选择了XML。有很多开源的XML库, 例如C++的Xerces,但是这个库很大,简单的xml解析,用TinyXML库就够了。网址下载:http://sourceforge.net/projects/tinyxml里面也就六个文件, 嫌麻烦你可以直接生成一个lib,直接使用头文件。 还是前面说的多叉树,用TinyXML写了一个解析器:原创 2009-04-30 09:53:00 · 1905 阅读 · 0 评论 -
控制台下面使用 OPENFILENAME结构 打开文件
毕设是在控制台下面利用opengl做了一个简单的软件,界面截图如下:最后想增加一个打开文件功能,使用了OPENFILENAME这个结构, 将工程属性设置为unicode字集,为了支持中文目录:1,使用宽字符串保存文件目录,2,然后将wstring转化为string,打开文件。需要注意的是,使用了这个结构打开文件,工程工作的相对目录会被修改到对话框选择的目录下面,(刚开始不知原创 2009-05-31 20:44:00 · 4953 阅读 · 2 评论 -
OpenGL下通过鼠标动态绘制三次Bezier曲线
三次Bezier曲线有四个控制节点。利用OpenGL的一维求值器原理。 程序介绍:第一次鼠标左键down点为0控制节点, 按住左键移动动态移动确定1控制节点,第二次鼠标左键down点3控制节点,按住左键移动,确定2控制节点。程序运行的效果图: 代码只是实现了绘制一段Bezier如下:#include #include #include usin原创 2009-09-21 14:00:00 · 7569 阅读 · 3 评论 -
基于OpenGL实现的多段Bezier曲线拼接
运行程序的交互方式有点类似corelDraw中的自由曲线绘制,或者photoShop中的钢笔自由路径绘制。截图: 将BezierCurve封装成了一个类,代码如下: #ifndef _BEZIERCURVE_H#define _BEZIERCURVE_H#include "vec3.hpp"#include #include #include u原创 2009-10-26 12:51:00 · 8438 阅读 · 7 评论 -
win32下面的DX初始化框架
#define STRICT#define WIN32_LEAN_AND_MEAN#include #include #include #include "resource.h"//-----------------------------------------------------------------------------// GLOBALS/原创 2009-11-06 21:31:00 · 1941 阅读 · 0 评论 -
纹理映射中的双线性插值
A texture mapping technique that produces a reasonably realistic image, also known as "bilinear filtering" and "bilinear texture mapping." An algorithm is used to map a screen pixel location to a cor原创 2009-11-17 14:56:00 · 4321 阅读 · 2 评论 -
OpenGL圆柱面绘制贴图
最近看到dx中的sample中有用顶点数组实现的圆柱体贴图的程序。于是自己写了一个圆柱体的类,支持生成纹理坐标,法线,坐标。构造圆柱体的参数主要有:水平分段数(就是上下圆的分段数目),高度上的分段数目,(至少有两段:上下两个圆面)半径,高度。顶点生成的原理:将圆柱面展开就是一个矩形。而纹理也是一个矩形区域,需要注意的是圆柱面是一个首尾相接的封闭面。效果图如下:原创 2009-12-02 18:21:00 · 11127 阅读 · 8 评论 -
小型 [造型引擎] 的构想
主要是实现3dmax中的一些功能: 1,二维中基本元素:3dmax中的线条的绘制是bspline,前段时间实现了bezier curve的交互绘制(完全模仿corl draw中的bezier曲线绘制或者Photoshop中的钢笔路径绘制功能),有时间计划实现一下bspline交互绘制。 2,三维中基本元素: 3,二维到三维的转化:挤出 Extrude:原创 2009-12-02 18:53:00 · 2230 阅读 · 0 评论 -
Alpha融合和图片透明度[AlphaBlend]
Alpha融合,不论是在3D还是2D中都常见,最常见的应用就是:设置图片的透明度,不透明度,可以实现抠图。 其实现思想如下:有个混合因子,主要是颜色混合:浮点表示:0.0f 整数表示: 0x00 分开计算R,G,B混合/* * alpha为混合因子 0.0 <= alpha <= 1.0 * alpha为混合因子 0x00 <= alpha <= 0xf原创 2009-12-13 21:22:00 · 14502 阅读 · 2 评论 -
纹理映射函数
/******************************************************************************* FUNCTION** INPUT** OUTPUT** RETURNS** AUTHOR** DESCRIPTION** Map a point (x, y, z) on转载 2009-12-15 10:17:00 · 2292 阅读 · 0 评论 -
透明 不透明 混合【3D游戏引擎设计】
源颜色:(Rs, Gs, Bs, As)不表颜色:(Rd, Gd, Bd, Ad)最终混合结果的颜色:(Rf, Gf, Bf, Af)此处讨论的所有颜色通道的值都是在[0, 1]范围之间。材质颜色和纹理图片的颜色都具有alpha通道。 一,使用alpha通道融合,最经典的用法就是作为混合因子,如果alpha = 1 完全不透明;alpha = 0完全透明。仅仅混合RGB通道的公翻译 2009-12-18 23:17:00 · 3398 阅读 · 0 评论 -
三角形跟射线求交
/*! V0,V1,V2三角形三顶点 I为交点 返回值 -1:没有交点 0: 交点在三角形外 1:交点在三角形内部*/int intersect_RayTriangle( const gtl::Rayf& R, const gtl::Vec3f& V0, const gtl::Vec3f& V1, const gtl::Vec3f& V2,原创 2010-02-25 10:16:00 · 6301 阅读 · 1 评论 -
求平面切割三角形的交线
算法还不太全面,下面只是一种最常见的相交情形:bool intersect_PlaneTriangle(const gtl::Vec3f& triVert0, const gtl::Vec3f& triVert1, const gtl::Vec3f& triVert2, const gtl::Vec3f& planeVert0,原创 2010-02-25 21:08:00 · 3642 阅读 · 0 评论 -
一些细节问题
都是一些最基本的问题,但是代码量大了以后,就容易忽略:1,使用了c语言中的malloc,最后释放指针使用了自定义的SAFE_DELETE_PTR宏。#define SAFE_DELETE_PTR(P) { if(p) { delete p; p = 0; } } 2,浮点数的比较问题。为了提高运算速度,将float转化为大整数参与运算,然后再转化成浮点数,损失了精度。当前后两种原创 2010-03-12 14:17:00 · 1174 阅读 · 0 评论 -
求取模型的三维凸包问题
三维凸包最经典的算法是:增量法。在这本书:"Computational Geometry in C" (Second Edition) by Joseph ORourke., 中文名《计算几何》这本书中有完整的增量法求取凸包的代码。下载的地址:http://maven.smith.edu/~orourke/books/ftp.html 我这里想说明的是,那本书中给出的代码原创 2010-03-09 20:13:00 · 2792 阅读 · 1 评论 -
三角形分割的法线问题
对三角形进行分割,情况比较复杂。首先,用平面去切割三角形,主要有四种情况:切割面经过,一个顶点 & 该顶点的对边切割面只经过一个顶点 切割平面只经过三角形的一条边(即经过三角形的两个顶点)切割平面经过三角形的两条边需要对三角形分割的,只有1,4两种情况。不管这两种的哪一种情形,都要注意一个三角形的顶点顺序问题,即三角面片的法向问题。分割出的子三角面片法向必须与原原创 2010-03-09 20:45:00 · 3057 阅读 · 0 评论 -
Sphere_VertexArray版本
练手:#include class CVertex{public: CVertex() {} CVertex(float fv1, float fv2, float fv3, float fu, float fv, float fn1, float fn2, float fn3) { v[0] = fv1; v[1] = fv2;原创 2010-01-05 14:26:00 · 2538 阅读 · 1 评论 -
编译器的那些事儿
1,/MD和/MDd将是潮流所趋,/ML和/MLd方式请及时放弃,/MT和/MTd在非必要时最好也不要采用了。2,静态链接 & 动态链接: 静态库是把程序运行时需要使用的函数编译在一个二进制文件中,扩展名为.lib。当程序link时把静态库中的二进制数据和程序其它数据放到一起。程序运行时不在需要lib和dll文件的支持。这样做的坏处是开发出来的程序占用磁盘空间较大。特别是windo原创 2010-04-11 13:21:00 · 1151 阅读 · 0 评论 -
多线程下避免使用单件模式
最近在研究插件技术,为了省事,定义了一个单件类:Kernal。在插件中调用getSingleton将插件添加到唯一的Kernal对象中:extern "C" BOX_PLUGIN_API void dllStartPlugin(){ //注册 box = new Box; Kernal::getSingleton()->getGeometryServer()->addGeometry( b原创 2010-04-21 21:48:00 · 1155 阅读 · 0 评论 -
类设计的一个原则
类设计的一个重要原则: 成员函数使用成员变量:最好通过类的接口函数调用,虽然按照语法也可以直接通过其名字调用。class Cube{ vec3 mCenter; Real mSize;public: vec3& center() { return mCenter;} const vec3& center() const { return mCenter;}原创 2010-04-20 13:47:00 · 913 阅读 · 0 评论 -
Loki泛化仿函数
泛化仿函数:可封装任何处理请求: 可接受函数指针,成员函数指针,仿函数,甚至其他泛化仿函数。具备类型安全性(typesafe)是一种带有“value”语义的对象,充分支持拷贝,赋值,传值。泛化仿函数允许任意拷贝,并且不会暴漏其虚函数。功能:将"处理请求"存储为数值,作为参数传递,并可以在远离其创建点之处调用在对象中存储一个处理请求(processing requ原创 2010-04-25 21:17:00 · 1392 阅读 · 1 评论 -
工厂模式之【Loki】
一,工厂模式的初衷 C++中class跟object是不同的东西:class由程序员产生,object由程序产生。你无法在执行期产生新的class,无法在编译器产生新的object。classes donnot have first-class status: You cannot copy a class, store it in a variable, or return原创 2010-04-27 09:32:00 · 2021 阅读 · 0 评论 -
Rational Rose学习笔记
1,给类添加属性比较简单。主要说说成员函数添加:在class Specification对话框中,打开Operation面板,添加成员函数,设置返回类型。双击operation名称,打开左图的对话框。打开Detail面板,在Argument区域,右键insert添加函数参数。 2,添加函数参数,和返回值以后,类视图中并没有显示出来,需要设置一下显示选项:Option原创 2010-04-29 16:37:00 · 2534 阅读 · 0 评论 -
QEasingCurve的绘制
QEasingCurve的介绍链接:http://doc.qt.io/qt-5/qeasingcurve.html把QT中QEasingCurve组件提取出来,在glut中实现了绘制。QEasingCurve中支持四十多种曲线,而且代码也相对独立。提取出来不是特别难。效果如图: 代码如下:#include < vector > #include < GL / glut.h &g...原创 2010-04-28 21:30:00 · 6409 阅读 · 0 评论 -
Qt学习笔记【1】
知识点:QTreeWidgetQTreeWidgetItemQDockWidgetQVBoxLayout Qt的界面布局中使用了层的概念,layout,当主窗口改变后,窗口中控件尺寸随之改变,对于layout需要设置margin。QTreeWidget的基本元素是QTreeWidgetItem,QTreeWidgetItem *styleItem = new Q原创 2010-05-06 20:18:00 · 2191 阅读 · 1 评论 -
坐标系的显示
正常状态显示: x轴被激活的时候:预期效果:选择坐标轴实现选中面的缩放和拉出操作选择坐标面上的圆弧对面进行旋转用VL写的,关键代码如下:// add the geometries to the VLs pipeline...void App_Axis::showAxis(){ //basic render states vl::r原创 2010-05-06 13:35:00 · 1849 阅读 · 0 评论 -
C++虚静态函数的实现
主要思路:通过非静态虚函数包裹静态函数将基类的静态函数私有化,迫使派生类必须重写静态函数。 class Base{ static void foo() { std::cout << "Base: " << count << endl; }protected: static int count;public: Base() { cou原创 2010-05-13 16:12:00 · 1689 阅读 · 0 评论 -
基于opengl的RoundBox绘制
openglRoundBox原创 2010-07-08 20:08:00 · 3277 阅读 · 1 评论 -
boost::any
typedef shared_ptr IntPtr; typedef shared_ptr FloatPtr; any anyVariant; anyVariant = IntPtr(new int(10)); IntPtr pInt = any_cast(anyVariant); 上面的代码:anyVariant中存储了一个int的智能指针。原创 2010-05-15 13:05:00 · 1038 阅读 · 0 评论