ccpNormalize分析 分类: coco2d-x c++ 2013-07-21 08:23 1767人阅读 评论(0) 收藏 举报 1、作用: 返回v的标准化向量,就是长度为1 2、源码分析: ccpNormalize源码如下 CCPoint ccpNormalize(const CCPoint& v) { return ccpMult(v, 1.0f/ccpLength(v)); } 从源码中可以看出其调用ccpMult,返回一个结果,那么我们先看ccpMult是做了些什么,源码如下: ccpMult(const CCPoint& v, const float s) { return ccp(v.x*s, v.y*s); } 从源码看出 点 v(x,y) (在这里称之为 向量v(x,y) 更为合适 的 x 和y坐标分别乘以 浮点数s 产生一个新 的向量返回 现在清楚了ccpMult做了什么,我在返回上面,使用ccpMult源码替换掉ccpNormalize中的ccpMult结果如下: CCPoint ccpNormalize(const CCPoint& v) { return ccp(v.x*1.0f/ccpLength(v), v.y*1.0f/ccpLength(v)); } 此时我们可能迫切的想知道ccpLength是干什么的,那么我就进入ccpLength的源码来看下这个家伙到底做了些什么,ccpLength源码如下 float ccpLength(const CCPoint& v) { return sqrtf(ccpLengthSQ(v)); } 我们知道sqrtf 是求平方根的,但是可能会问ccpLengthSQ又是干嘛的啊,我沉住气,进入ccpLengthSQ方法,一探究竟 static inline float ccpLengthSQ(const CCPoint& v) { return ccpDot(v, v); } 进入一看仅仅简单的返回一个ccpDot,然而ccpDot又是干嘛的勒,这个时候,有人可能会放弃下探索,将失去一个揭开其神秘面纱的机会, 我们继续,看下ccpDot干了些啥。 static inline float ccpDot(const CCPoint& v1, const CCPoint& v2) { return v1.x*v2.x + v1.y*v2.y; } 这下我们明白了,ccpDot是将向量v1与v2的x方向、y方向的值分别相乘然后在相加得到一个浮点数,我们现在到底,开始返回, 这时我们清楚了ccpLengthSQ,返回的是 v.x*v.x+v.y*v.y 即向量v的平方和。 我们在往上,看ccpLength,现在明白原来ccpLength是计算向量 v 的大小的,我们将下面的函数合并在一起,ccpNormalize表示如下: CCPoint ccpNormalize(const CCPoint& v) { return ccp(v.x*(1.0f/sqrtf(v.x*v.x+v.y*v.y)),v.y*(1.0f/sqrtf(v.x*v.x+v.y*v.y)) ); } 从公式可以看出ccpNormalize是将向量 v 转换为v的单位向量。至此我们完全清楚ccpNormalize的用法了。 在CCPointExtension文件中有大量的关于向量运算的方法,有兴趣的朋友可以研究一下。
归一化方法
把数变为(0,1)之间的小数
主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。
例1:{2.5 3.5 0.5 1.5}归一化后变成了{0.3125 0.4375 0.0625 0.1875}
解:2.5+3.5+0.5+1.5=8,
2.5/8=0.3125,
3.5/8=0.4375,
0.5/8=0.0625,
1.5/8=0.1875.
这个归一化就是将括号里面的总和变成1.然后写出每个数的比例。
南来地,北往的,上班的,下岗的,走过路过不要错过!
======================个性签名=====================
之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?
下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!
如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.