
算法
ryfdizuo
腾讯专家开发工程师(T12/T4-1) Live Long And Prosper.
展开
-
三角化库对比分析
主要对比triangle库和libtess,压箱底的数据,share出来。包大小对比libtesstriangle包大小30k82k风格cc性能对比地图三角化中随机选了一批顶点个数的多边形,性能结果如下:sizetesstri(ms)4662253422602226092261522626327513280033112853123983.原创 2020-06-28 12:03:58 · 1092 阅读 · 0 评论 -
四元数实现插值动画
/* * Quaternion slerp animation * dizuo */#include #include #include #include #include #include #include #include float rotVerticesBuf[] = {0,0,0, 1,0,0};gtl::Quatf begQuat( gtl::Vec3f(原创 2012-11-25 17:21:05 · 2413 阅读 · 0 评论 -
曾经的面试题目总结
猴子分桃问题:五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;.....其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?(朋友说,这是小学奥数题)。http://blog.youkuaiyun.com/v_july_v/artic转载 2012-11-21 09:14:33 · 1445 阅读 · 0 评论 -
信号压缩:增量压缩
理论知识增量压缩 适合信号压缩。最原始的思路比较简单,假设原始数据是一个int序列,经过增量压缩时,第一个整数仍然用4个字节表示,后续的整数可以 保存增量,增量用一个signed char表示,注意增量可正可负。举个例子:原始序列:P0, P1, P2, P3压缩序列:P0, D1, D2, D3解压 压缩序列时:P1 = P0 + D1;P2 = P0 + D1 +原创 2012-09-22 10:01:20 · 3609 阅读 · 0 评论 -
LRU缓存设计
缓存的数据结构采用哈希表,key到value的映射。网上有些资料采用记录数据的使用时刻 实现LRU策略,此处采用双向链表 实现LRU策略。LRU Least Recently Used,MRUMost Recently Used双向链表,lruPtr头指向最近最少使用的元素,mruPtr头指向最近最多使用的元素。LRUCache tc(3); //最大三个元素tc.inser原创 2012-08-28 17:37:42 · 13302 阅读 · 0 评论 -
特征向量的几何含义
原文地址:http://fanhy298.blog.sohu.com/130363634.html长时间以来一直不了解矩阵的特征值和特征向量到底有何意义(估计很多兄弟有同样感受)。知道它的数学公式,但却找不出它的几何含义,教科书里没有真正地把这一概念从各种角度实例化地进行讲解,只是一天到晚地列公式玩理论——有个屁用啊。根据特征向量数学公式定义,矩阵乘以一个向量的结果仍是同维数的转载 2012-08-07 09:30:47 · 1413 阅读 · 0 评论 -
基于OpenGL的角色动画实现
我的本科毕设做的是一个BVH文件解析,角色关节也是一个多叉树,层次变换树。孩子节点依赖于结点的变换。上图中的角色以躯干Torso为根节点,脖子和头属于一个子树;左右手臂、左右腿分别属于四个子树,所以上图是一个五叉层次变换树。尤其强调的是手臂支持三个维度的运动,所以需要需要增加x,y,z的三层虚节点。右手臂的子树为:Torso/RShoulderX / RShoulderY/RShoulderZ原创 2012-03-19 12:57:23 · 8591 阅读 · 7 评论 -
【疑问】Win7窗体外框的阴影效果
仔细观察,不难发现窗体外框有一层淡淡地阴影效果。其实现机制?原创 2012-03-08 14:55:03 · 2004 阅读 · 2 评论 -
快速排序 [Algorithm]
杂谈:指针和数组 对于数组编译器可以自动推到出内部元素的大小,可以通过sizeof或者模板, //1int myints[] = {10,20,30,5,15};int length = sizeof(myints)/sizeof(myints[0]);//2template int GetArraySize(T (&ptr)[size]){ return s原创 2010-12-08 18:52:00 · 1217 阅读 · 0 评论 -
堆排序 [Algorithm]
老生常谈: 插入排序最坏情况O(n2), 其内循环比较紧凑,对于小规模输入是一个快速的原地(数组中某个局部)排序算法。归并排序有着渐进运行时间nlgn时间,merge不在原地操作(merge最用在整个数组中)。堆排序正是前面两者优点的整合,在nlgn时间,对n个数进原创 2010-12-07 19:35:00 · 1727 阅读 · 0 评论 -
非比较排序 [Algorithm]
序言 非比较排序,不需要比较,交换,在线性时间内完成排序。缺点:空间要求较多,不是原地排序,典型的空间换取时间。计数排序 计数排序利用一个特点:已经排好序(例如从小到大)的数组中,第i个元素为x,则数组中一定有:小于等于x的元素有i个。计数排序需要一个空间原创 2010-12-09 15:26:00 · 1179 阅读 · 0 评论 -
单词分类排序-基于二维链表
问题来源:http://topic.youkuaiyun.com/u/20110702/19/572f6747-20cb-45ac-8efc-b694820ded26.html?seed=158117872&r=74178770#r_74178770每一行存储个数相同的字符串,行与行之间根据单词长度从大到小。存储结构是个二维链表。#include #include #include #defi原创 2011-07-02 20:43:06 · 2038 阅读 · 0 评论 -
替换字符串中所有子串
例9-16 输入三个字符串,将字符串1中所有与字符串2相同的子串替换成字符串3。例如,输入的字符串1为"werLOOPouyio3o565p6 LOOPedd",字符串2为"LOOP",字符串3为"NEW",那么替换后,字符串1为"werNEWouyio3o565p6NEWedd"。根据题意,写一个符合要求的函数头。函数有两个char型数组指针的输入参数,一个char型数组指针输出参数,没有原创 2011-06-24 20:15:00 · 5249 阅读 · 1 评论 -
opengl实现任意两点间画圆柱体
1,问题提出两点间画线简单:glBegin(GL_LINES); //注意是LINES不是LINE,这个错误一定要注意。 glVertexf(x1, y1, z1); glVertexf(x2, y2, z2);glEnd();画线函数不会影响opengl的矩阵堆栈。 但是很多时候线条效果会比较差,比如我要做一个骨骼动画,关节点间的骨头用线条太难看,即使使用glLin原创 2011-06-16 13:21:00 · 12401 阅读 · 4 评论 -
脚本配置组件
规则说明:Config文件格式说明: 1.每个数据块以 . 标志 2.数据块内部 格式:每一行就包括两项:name,data 特别注意: 同一内容的数据间不可以用空格分开,否则不能被整体存储. size 500 500 500 ----wrong size 500/500/500 ----right 例子脚本 .SkyBoxbackBmp Data原创 2009-12-24 14:22:00 · 1518 阅读 · 0 评论 -
纹理模拟球体漫反射
先看下面的效果图: 没有灯光,没有设置材质属性,没有绘制球体,更加没有设置球体的漫反射系数。。。其实是将一个特殊的纹理映射到一个圆上的结果。纹理生成函数,类似棋盘函数,所以只需将红皮书上棋盘函数稍作修改: int fakeSphere(int i, int j){ float s = (float)i / checkImageWidth; float t =原创 2009-11-24 18:28:00 · 2347 阅读 · 0 评论 -
3D坐标系变换
3D坐标系变换~原创 2011-03-30 08:38:00 · 14337 阅读 · 0 评论 -
clipper库使用的一些心得
多边形处理库clipper 的使用心得总结原创 2014-11-03 17:02:29 · 16169 阅读 · 5 评论 -
函数和汇编
1. 函数传参函数栈增长方向与地址方向相反,栈增长方向 高地址向低地址增长。esp指向函数栈顶,ebp指向函数栈底,传值拷贝:大数据传指针和引用参数压栈顺序函数参数在函数栈帧的外面,函数局部变量参数定义在栈上2. 函数返回值拷贝原创 2013-07-09 16:10:18 · 2108 阅读 · 0 评论 -
OpenGL绘制矢量路径的思路
1. 引言软件方法绘制,如QT、Android(skia)都自带2D绘图引擎,支持矢量路径填充并且抗锯齿!如果使用OpenGL绘制矢量,对建模算法以及纹理都有要求,不同的建模算法决定了最终的视觉效果。OpenGL绘制路径,抗锯齿效果由纹理来实现。下面介绍两种不同效果的路径实现和绘制:2. 纯色圆角路径通过纹理方式实现抗锯齿单色路径绘制。建模算法非常简单:将一个polyline分解成原创 2013-08-05 10:17:46 · 8144 阅读 · 4 评论 -
两种2D相交性测试场景的优化技巧
1. 点和多边形相交线测试优化:通过细分part粒度实现加速。2. 文字相交线测试优化,OOBB并不一定最优 计算量十分大,将每个字单独做成AABB。原创 2014-04-05 16:16:11 · 1931 阅读 · 0 评论 -
谈谈C++中的swap函数
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符。template void swap ( T& a, T& b ){ T c(a); a=b; b=c;} 需要构建临时对象,一个拷贝构造,两次赋值操作。2,针对int型优化:void swap(int & __restrict a, int & __restrict b){a ^= b;b ^= a原创 2011-05-21 00:32:00 · 142808 阅读 · 6 评论 -
不简单的【线段求交】
一直以来感觉线段求交这种级别的算法很easy,甚至没有专门研究的必要,实际操作过程发现简约不简单,需要考虑各种特殊case。google一些后还是没有满意的结果,有理论的没有code,有code的没有理论甚至怀疑有漏洞。最后融会贯通后给出一个可用的版本:1. 通过两个线段的包围盒快速拒绝。2. 处理包围盒相交,但实际线段并不相交的case:两条线段不相交,当且仅当:一条原创 2013-12-07 19:03:01 · 2974 阅读 · 4 评论 -
二维中的OBB相交测试
OBB方向性!求交核心思想:向量点积的投影意义,unitX为(1,0)单位向量, A.dot( unitX ) 为A点的x值,表示在x轴上的投影。。flipcode上面求交有问题,投影结果坐标系不统一。原创 2013-10-23 21:05:53 · 4282 阅读 · 1 评论 -
android上gl纹理资源路径的问题
问题描述:glsurfaceView中通过纹理绘制图形,纹理长宽为2的幂次,128*64,资源放在res/drawable文件夹下面。发现在hdpi手机上图形为白色。初步判断纹理丢失。为什么纹理丢失呢?我直接把问题归咎于奇葩的android,感觉hdpi手机优先搜索drawable-hdpi文件夹,并没有搜索drawable目录。通过实际盘查,资源上传gl前将图片保存到磁盘,发现图片确原创 2013-09-18 20:07:50 · 1860 阅读 · 0 评论 -
Array of Structures vs Structure of Arrays
1. 概念Array of structures 结果是一个array,类型是一个structure! Structureof Arrays结果是一个struture,类型是arrays!2. 原理的原文连接:http://hectorgon.blogspot.com/2006/08/array-of-structures-vs-structure-of.html翻译 2013-08-14 10:54:48 · 3031 阅读 · 0 评论 -
GPU加速技术揭秘
1.浏览器硬件加速1.1 底层依赖于fbo技术 FBO全称frame buffer object,与系统默认帧缓冲区类似,fbo也有三个缓冲区:color,stencil,depth。fbo最精髓支持在于通过可以将opengl绘制到指定一块缓冲区上,可以是texture object,可以是render buffer object。常常采用texture作为fbo的颜色缓冲区,后续原创 2013-02-06 09:52:34 · 4615 阅读 · 0 评论 -
基于udp的监视系统示例
前言想法来源:http://nashruddin.com/Web_Based_Surveillance_System_with_OpenCV_PHP_and_Javascript这篇文章是基于opencv,php,javascript做了一个基于网络的监视系统。偶虽然熟悉opencv,稍微懂点javascript,但是不懂php,所以只能另辟新径:服务器:通过opencv捕获每一帧原创 2011-06-24 21:50:00 · 2935 阅读 · 0 评论 -
C++实现的十字链表:容器和迭代器
十字链表容器迭代器原创 2011-04-25 11:20:00 · 4294 阅读 · 4 评论 -
任意多边形顶点排序和凸包计算
1,理论凸包计算算法导论上有讲,关键步骤是根据对顶点进行逆时针排序。凸包顶点只是多边形顶点子集。图-1如图1中,判断三个点构成顺时针还是逆时针方向。使用向量点积即可:向量A向量BA.dot(B) 是一个实数,大于0,则逆时针,小于0则顺时针。2,效果图:图 - 2图 - 3图2是随机生成了三十个点。图3是黄色线条是排序以后顺序链接,外面淡蓝色原创 2011-06-10 14:56:00 · 11698 阅读 · 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 评论 -
透明 不透明 混合【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 评论 -
纹理映射函数
/******************************************************************************* FUNCTION** INPUT** OUTPUT** RETURNS** AUTHOR** DESCRIPTION** Map a point (x, y, z) on转载 2009-12-15 10:17:00 · 2292 阅读 · 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 评论 -
渐变填充算法模拟
实现了渐变和按照正弦曲线变化,效果如图:上图为竖直放向颜色按照正弦变化,下图为线性渐变。只要有好的函数,就可以实现出更好的填充算法。代码如下,程序用GDI实现的,因为GDI中图像以像素为单位。/*---------------------------------------Gradient效果11/18/2009 RYF----------------------原创 2009-11-20 13:37:00 · 2692 阅读 · 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实现的多段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 评论 -
用XML文件作为多叉树的脚本
现在很多软件配置,包括游戏UI的配置文件都选择了XML。有很多开源的XML库, 例如C++的Xerces,但是这个库很大,简单的xml解析,用TinyXML库就够了。网址下载:http://sourceforge.net/projects/tinyxml里面也就六个文件, 嫌麻烦你可以直接生成一个lib,直接使用头文件。 还是前面说的多叉树,用TinyXML写了一个解析器:原创 2009-04-30 09:53:00 · 1905 阅读 · 0 评论 -
一个四叉树的简单实现
最近利用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 评论