本文主要内容转载自:cocos2d-x懒人数学函数
避免浪费找资料人士的时间,直接上关联:以上链接中所列出的函数在 CGPoint 中可以找到。
一开始是想,游戏引擎应该是会有具备一些例如计算两点间距离的之类简单又有用的函数,但是在 MathUtils 中就是没有找到这么样一类的函数。
之后试了试采用文件查找的方式来查找distance的引用,也最终是没找到……
最后看到这篇文章,抱着试试的想法,将 ccpDistance 用文件查找的方式找了下,居然就找到了在CGPoint中有定义。难道是我之前查找的姿势不对~distance就没办法查到?
------------------------------------------------------- 免得传送门跳转 -------------------------------------------------------
数学函数:
ccp(x, y); // 以坐标x,y创建一个向量
ccpFromSize(s); // 以size s的width为x,height为y创建一个向量
CCPoint的加减乘除运算运算:
ccpAdd(v1, v2); // 等价 ccp(v1.x+v2.x, v1.y+v2.y);
ccpSub(v1, v2); // 等价 ccp(v1.x-v2.x, v1.y-v2.y);
ccpNeg(v) // 等价 ccp(-v.x, -v.y);
ccpMult(v, s); //等价 ccp(v.x * s, v.y * s); s是个浮点数
取中点:
ccpMidpoint(v1, v2); // 等价 ccp( (v1.x + v2.x)/2, (v1.y + v2.y)/2 );
点乘、叉乘、投影:
ccpDot(v1, v2); // 等价 v1.x * v2.x + v1.y * v2.y;
ccpCross(v1, v2); // 等价 v1.x * v2.y - v1.y * v2.x;
ccpProject(v1, v2) // 返回的是向量v1在向量v2上的投影向量
求长度、距离和各自的平方值:
ccpLength(v) // 返回向量v的长度,即点v到原点的距离
ccpLengthSQ(v) // 返回向量v的长度的平方,即点v到原点的距离的平方
ccpDistance(v1, v2) // 返回点v1到点v2的距离
ccpDistanceSQ(v1, v2) // 返回点v1到点v2的距离的平方
ccpNormalize(v) // 返回v的标准化向量,就是长度为1
旋转、逆时针90度、顺时针90度:
ccpRotate(v1, v2); // 向量v1旋转过向量v2的角度并且乘上向量v2的长度。当v2是一个长度为1的标准向量时就是正常的旋转了,可以配套地用ccpForAngle
ccpPerp(v); // 等价于 ccp(-v.y, v.x); (因为opengl坐标系是左下角为原点,所以向量v是逆时针旋转90度)
ccpRPerp(v); // 等价于 ccp(v.y, -v.x); 顺时针旋转90度
配套的有向量和弧度的转换向量,还有一些角度相关的:
ccpForAngle(a); // 返回一个角度为弧度a的标准向量
ccpToAngle(v); // 返回向量v的弧度
ccpAngle(a, b); // 返回a,b向量指示角度的差的弧度值
ccpRotateByAngle(v, pivot, angle) // 返回向量v以pivot为旋转轴点,按逆时针方向旋转angle弧度
线段相交的检测:
ccpLineIntersect(p1, p2, p3, p4, &s, &t); // 返回p1为起点p2为终点线段1所在直线和p3为起点p4为终点线段2所在的直线是否相交,如果相交,参数s和t将返回交点在线段1、线段2上的比例
// 得到s和t可以通过 p1 + s * (p2 - p1) 或 p3 + t * (p4 - p3) 求得交点。
ccpSegmentIntersect(A, B C, D) // 返回线段A-B和线段C-D是否相交
ccpIntersectPoint(A, B, C, D) // 返回线段A-B和线段C-D的交点
其他有用的:
CC_RADIANS_TO_DEGREES(a); // 弧度转角度
CC_DEGREES_TO_RADIANS(a); // 角度转弧度
CCRANDOM_0_1(); // 产生0到1之间的随机浮点数
CCRANDOM_MINUS1_1(); // 产生-1到1之间的随机浮点数