
算法
mybloglucis009
这个作者很懒,什么都没留下…
展开
-
算法系列之二: 三只水桶等分水问题
原文地址:http://blog.youkuaiyun.com/orbit/article/details/6596521 有一个容积为8升的水桶里装满了水,另外还有一个容积为3升的空桶和一个容积为5升的空桶,如何利用这两个空桶等分8升水?附加条件是三个水桶都没有体积刻度,也不能使用其它辅助容器。 这是一道经典题目,一般人都可以在一分钟内给出答案,不过,很多人可能没有注意到转载 2013-01-08 15:30:09 · 483 阅读 · 0 评论 -
算法系列之十二:多边形区域填充算法--几种边标志填充算法 .
四、边界标志填充算法 在光栅显示平面上,多边形是封闭的,它是用某一边界色围成的一个闭合区域,填充是逐行进行的,即用扫描线逐行对多边形求交,在交点对之间填充。边界标志填充算法就是在逐行处理时,利用边界或边界颜色作为标志来进行填充的。准确地说,边界标志填充算法不是指某种具体的填充算法,而是一类利用扫描线连贯性思想的填充算法的总称。这类算法有很多种,本篇就介绍几种。转载 2013-01-08 15:49:18 · 2137 阅读 · 0 评论 -
算法系列之八:RLE行程长度压缩算法 .
RLE(Run Length Encoding)行程长度压缩算法(也称游程长度压缩算法),是最早出现、也是最简单的无损数据压缩算法。RLE算法的基本思路是把数据按照线性序列分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。对于第一种情况,对连续的重复数据块进行压缩,压缩方法就是用一个表示块数的属性加上一个数据块代表原来连续的若干块数据。对于第二种情况,RLE算法有两种处理方法,一种转载 2013-01-08 15:39:31 · 822 阅读 · 0 评论 -
算法系列之十二:多边形区域填充算法--扫描线种子填充算法 .
1.3扫描线种子填充算法 1.1和1.2节介绍的两种种子填充算法的优点是非常简单,缺点是使用了递归算法,这不但需要大量栈空间来存储相邻的点,而且效率不高。为了减少算法中的递归调用,节省栈空间的使用,人们提出了很多改进算法,其中一种就是扫描线种子填充算法。扫描线种子填充算法不再采用递归的方式处理“4-联通”和“8-联通”的相邻点,而是通过沿水平扫描线填充像素段,一段一段地来处理“4转载 2013-01-08 15:46:32 · 716 阅读 · 0 评论 -
算法系列之十三:椭圆的生成算法 .
椭圆和直线、圆一样,是图形学领域中的一种常见图元,椭圆的生成算法(光栅转换算法)也是图形学软件中最常见的生成算法之一。在平面解析几何中,椭圆的方程可以描述为(x – x0)2 / a2+ (y – y0)2 / b2 = 1,其中(x0, y0)是圆心坐标,a和b是椭圆的长短轴,特别的,当(x0, y0)就是坐标中心点时,椭圆方程可以简化为x2 / a2 + y2 / b2 = 1转载 2013-01-08 15:50:05 · 693 阅读 · 0 评论 -
Bezier曲线的原理 及 二次Bezier曲线的实现 .
Bezier曲线的原理Bezier曲线是应用于二维图形的曲线。曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状。 一次Bezier曲线公式:原理" alt="" src="http://hi.youkuaiyun.com/attachment/201008/28/0_1282984413d5g2.gif">原理" alt="" src="http://hi.youkuaiyun.com/a转载 2013-01-11 14:01:28 · 1583 阅读 · 0 评论 -
A*寻路 -- 算法优化
基本思路: 1二叉堆 2用version代替close open列表 3用精简的估计公式 4提前运算 5代码本身的优化。 这个寻路算法基本还没找到as3写的能超过他的。 Java代码 package { /** * ... * @author sliz http://game-dev转载 2013-01-13 02:43:15 · 1173 阅读 · 1 评论 -
A*寻路 -- 更加真实 的路径(一)
地址:http://chaimzane.iteye.com/blog/1629039对于A*寻路算法,可能是游戏开发者讨论最多的话题之一,很多游戏都会用到它来实现游戏角色的寻路。那么我这篇帖子的价值何在呢?先来看看传统A*算法存在的问题:1.尴尬的Z型路径 当你在用A*算法实现了角色行走逻辑后,点击一个目标点,虽然你起点和目标点间没有任何障碍物,但角色还TMD蛋疼地进行转载 2013-01-13 02:33:38 · 2701 阅读 · 0 评论 -
A*寻路 -- 更加真实 的路径(二)
转:http://bbs.9ria.com/thread-95620-1-1.html 对于A*传统寻路的结果不平滑的问题,我们讨论了一种判断两点间是否存在障碍物的算法,并在用户点击鼠标选择了目的地后先判断起终点间是否存在障碍物,若不存在,则路径数组中将只具有一个终点节点;否则进行A*寻路运算。大致过程可用下面代码表示: Java代码 //判断起终点间是否存在转载 2013-01-13 02:41:21 · 3759 阅读 · 0 评论 -
A*寻路 -- 弗洛伊德(Floyd)算法
转:http://www.itweb2.com/article/system/317.htm 弗洛伊德(Floyd)算法过程:1、用D[v][w]记录每一对顶点的最短距离。2、依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否可用过该基点让这对顶点间的距离更小。算法理解:最短距离有三种情况:1、两点的直达距离最短。(如下图)2、两点间只通过一转载 2013-01-13 02:42:16 · 1385 阅读 · 0 评论 -
XNA中文显示学习
学习XNA一段时间了,但是中文还是不能显示,感觉上XNA就象个婴儿一样脆弱,然后就仔细的去找了一遍关于中文显示的范例,开始说的是即时编译的方法,就是用xml编译需要的字库,然后显示,费时费力,看来没多少选择,所以我也没看这种方法,偶然翻看论坛,发现一个帖子,是中文显示类,我一开始认为可能和那个方法差不多,其实自己也在想用点阵这种低效率方法了,一看好像没进行什么编译,采用的是把字写到图片缓冲上,我一转载 2013-01-15 14:00:06 · 571 阅读 · 0 评论 -
Bezier曲线的绘制
2012-12-25 17:18440人阅读评论(0)收藏举报Bezier曲线是参数多项式曲线,它由一组控制多边形折线(控制多边形)的顶点唯一定义,在控制多边形的各顶点中,只有第一个和最后一个顶点在曲线上,其他的顶点则用以定义曲线的导数,阶次和形状Bezier曲线的数学基础是能够在第一个和最后一个顶点之间进行插值的一个多项式混合函数,对于有n+1个控制点的Bezier曲线段用参数方程表转载 2014-07-25 17:30:14 · 958 阅读 · 0 评论 -
3D软引擎之三角形光栅化
昨天前天实现了三角形光栅化算法,然而在邻近三角形之间出现了裂缝,于是弄了一天,后来,查看了《3D游戏编程大师技巧》的源码的示例,一看,他那没有裂缝,我这代码是按照书本的思路去实现的,经过一翻挣扎把它的代码移植到自己的代码,再经过一翻大修改,F5调试运行,结果仍然有裂缝!我觉得奇怪了,于是再对照了一遍代码,原来还有一个编译开关,于是又把另一编译开关所在的代码复制过来,然后再修改,在修改过的过程中遇到原创 2015-05-31 13:02:37 · 1344 阅读 · 0 评论 -
算法系列之十二:多边形区域填充算法--改进的扫描线填充算法 .
三、改进的扫描线填充算法 扫描线填充算法的原理和实现都很简单,但是因为要同时维护“活动边表(AET)”和“新边表(NET)”,对存储空间的要求比较高。这两张表的部分内容是重复的,而且“新边表”在很多情况下都是一张稀疏表,如果能对其进行改进,避免出现两张表,就可以节省存储空间,同时省去从“边表”生成“新边表”的开销,同时也省去了用“新边表”维护“活动边表”的开销,基于这个原则可以对转载 2013-01-08 15:48:42 · 411 阅读 · 0 评论 -
算法系列之十二:多边形区域填充算法--扫描线填充算法(有序边表法) .
二、扫描线算法(Scan-Line Filling) 扫描线算法适合对矢量图形进行区域填充,只需要直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电脑游戏和三维CAD软件的渲染等等。 对矢量多边形区域填充,算法核心还是求交。《计算几何与图形学有关的几种常用算法》一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算转载 2013-01-08 15:47:55 · 494 阅读 · 0 评论 -
算法系列之五:最长公共子序列(LCS)问题(非连续子序列)的两种解法
最长公共子序列也称作最长公共子串,英文缩写是LCS(Longest Common Subsequence)。其定义是:一个序列S,如果分别是两个或多个已知序列的子序列,且是符合此条件的子序列中最长的,则称S为已知序列的最长公共子序列。 关于子序列的定义通常有两种方式,一种是对子序列没有连续的要求,其子序列的定义就是原序列中删除若干元素后得到的序列。另一种是对子序列有连续的要求,其转载 2013-01-08 15:35:50 · 534 阅读 · 0 评论 -
算法系列之六:最长公共子序列(LCS)问题(连续子序列)的三种解法 .
最长公共子序列(LCS)问题有两种方式定义子序列,一种是子序列不要求不连续,一种是子序列必须连续。上一章介绍了用两种算法解决子序列不要求连续的最终公共子序列问题,本章将介绍要求子序列必须是连续的情况下如何用算法解决最长公共子序列问题。 仍以上一章的两个字符串 “abcdea”和“aebcda”为例,如果子序列不要求连续,其最长公共子序列为“abcda”,如果子序列要求是连续,则其转载 2013-01-08 15:36:43 · 334 阅读 · 0 评论 -
算法系列之十一:圆生成算法 .
在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 + y2 = R2。在计算机图形学中,圆和直线一样,也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法。为了简化,我们先考虑圆心在原点的圆的生成,对于中心不是原点的圆,可转载 2013-01-08 15:45:28 · 411 阅读 · 0 评论 -
算法系列之十二:多边形区域填充算法--递归种子填充算法 .
平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案填充)。区域填充中最常用的是多边形填色,本文中我们就讨论几种多边形区域填充算法。一、种子填充算法(Seed Filling) 如果要填充的区域是以图像元数据方式给出的,通常使用种子填充算法(Se转载 2013-01-08 15:45:59 · 597 阅读 · 0 评论 -
算法系列之十四:狼、羊、菜和农夫过河问题 .
题目描述:农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。 这个题目考察人的快速逻辑运算和短期记忆力。分析一下,在狼-》羊-》菜这个食物链条中,“羊”处在关键位置,解决问题的指导思想就是将“羊”与“狼”转载 2013-01-08 15:50:57 · 1816 阅读 · 0 评论 -
算法系列之一 : Google方程式
原文地址:http://blog.youkuaiyun.com/orbit/article/details/7082678有一个字符组成的等式:WWWDOT - GOOGLE = DOTCOM,每个字符代表一个0-9之间的数字,WWWDOT、GOOGLE和DOTCOM都是合法的数字,不能以0开头。请找出一组字符和数字的对应关系,使它们互相替换,并且替换后的数字能够满足等式。这个字符等式是Google公司能转载 2013-01-08 15:27:45 · 296 阅读 · 0 评论 -
算法系列之三:妖怪与和尚过河问题
有三个和尚(或传教士)和三个妖怪(或食人怪)过河,只有一条能装下两个人(和尚或妖怪)的船,在河的任何一方或者船上,如果妖怪的人数大于和尚的人数,那么和尚就会有被吃掉的危险。你能不能找出一种安全的渡河方法呢? 这是一个很有意思的智力题,但是并不难,每次可以选择一个人或者两个人过河,只要保证在河的任何一边的和尚数量总是大于或等于妖怪的数量即可。这里先给出一种过河方法: 两个妖转载 2013-01-08 15:32:55 · 453 阅读 · 0 评论 -
算法系列之四:字符串的相似度
我们把两个字符串的相似度定义为:将一个字符串转换成另外一个字符串的代价(转换的方法可能不唯一),转换的代价越高则说明两个字符串的相似度越低。比如两个字符串:“SNOWY”和“SUNNY”,下面给出两种将“SNOWY”转换成“SUNNY”的方法: 变换1: S - N O W Y S U N N - Y Cost = 3 (插入U、替换O、删除W)转载 2013-01-08 15:33:40 · 275 阅读 · 0 评论 -
算法系列之七:爱因斯坦的思考题(上) .
这是一个很有趣的逻辑推理题,传说是爱因斯坦提出来的,他宣称世界上只有2%的人能解出这个题目,传说不一定属实,但是这个推理题还是很有意思的。题目是这样的,据说有五个不同颜色的房间排成一排,每个房间里分别住着一个不同国籍的人,每个人都喝一种特定品牌的饮料,抽一种特定品牌的烟,养一种宠物,没有任意两个人抽相同品牌的香烟,或喝相同品牌的饮料,或养相同的宠物,问题是谁在养鱼作为宠物?为了寻找答案,爱因斯坦给转载 2013-01-08 15:37:27 · 458 阅读 · 0 评论 -
算法系列之七:爱因斯坦的思考题(下) .
CheckGroupRelation()函数需要根据当前组group的位置进行适当的处理,如果当前组是第一个组或最后一个组,则group的相邻组只有一个,就是最靠近group的组,其它情况下group的相邻组都是两个。CheckGroupRelation()函数的实现如下:162 bool CheckGroupRelation(GROUP*groups, int g转载 2013-01-08 15:38:47 · 326 阅读 · 0 评论 -
算法系列之九:计算几何与图形学有关的几种常用算法(一)
我的专业是计算机辅助设计(CAD),算是一半机械一半软件,《计算机图形学》是必修课,也是我最喜欢的课程。热衷于用代码摆平一切的我几乎将这本教科书上的每种算法都实现了一遍,这种重复劳动虽然意义不大,但是收获很多,特别是丢弃了多年的数学又重新回到了脑袋中,算是最大的收获吧。尽管已经毕业多年了,但是每次回顾这些算法的代码,都觉得内心十分澎湃,如果换成现在的我,恐怕再也不会有动力去做这些事情了。转载 2013-01-08 15:41:30 · 437 阅读 · 0 评论 -
算法系列之九:计算几何与图形学有关的几种常用算法(二) .
3.6 用矢量的叉积判断直线段是否有交 矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心算法,也是体现速度和稳定性的重要标志,高效并且稳定的求交算法是任何一个CAD软件都必需要重点关注的。求交包含两层概念,一个是判断是否相交,另一个是求出交点。直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交。转载 2013-01-08 15:42:01 · 507 阅读 · 0 评论 -
算法系列之十:直线生成算法 .
在欧氏几何空间中,平面方程就是一个三元一次方程,直线就是两个非平行平面的交线,所以直线方程就是两个三元一次方程组联立。但是在平面解析几何中,直线的方程就简单的多了。平面几何中直线方程有多种形式,一般式直线方程可用于描述所有直线: Ax+By+C = 0 (A、B不同时为0) 当知道直线上一点坐标(X0,Y0)和直线的斜率K存在时,可以用点斜式方程: Y-Y0 = K(X转载 2013-01-08 15:44:48 · 385 阅读 · 0 评论 -
3D软引擎之深度排序
花了不少时间去实现了这个功能,大多问题都出现在低级错误,看来以后要提醒十二分精神!错误的原因是: void CTriangle2DUtils::DrawSolidGeneralClipZOrder( D3DXVECTOR3 p0, D3DXVECTOR3 p1, D3DXVECTOR3 p2, int color ){ if (p0.y > p1.y) Math3D::Swap(p原创 2015-06-01 22:35:43 · 807 阅读 · 0 评论