ccpNormalize分析

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文件中有大量的关于向量运算的方法,有兴趣的朋友可以研究一下。

文章转载于:http://blog.csdn.net/lideshan12/article/details/9395775

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值