/** Returns opposite of point. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpNeg(const CCPoint v) //计算关于原点的对称点 { return ccp(-v.x, -v.y); } /** Calculates sum of two points. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpAdd(const CCPoint v1, const CCPoint v2)//计算两个向量的和 { return ccp(v1.x + v2.x, v1.y + v2.y); } /** Calculates difference of two points. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpSub(const CCPoint v1, const CCPoint v2)// 计算两个向量的差 { return ccp(v1.x - v2.x, v1.y - v2.y); } /** Returns point multiplied by given factor. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpMult(const CCPoint v, const CGFloat s)// 给定一个因子,算向量的倍数 { return ccp(v.x*s, v.y*s); } /** Calculates midpoint between two points. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpMidpoint(const CCPoint v1, const CCPoint v2)// 计算两个点得中心点 { return ccpMult(ccpAdd(v1, v2), 0.5f); } /** Calculates dot product of two points. @return CGFloat @since v0.7.2 */ static inline CGFloat ccpDot(const CCPoint v1, const CCPoint v2)// 计算两个向量的点乘积 { return v1.x*v2.x + v1.y*v2.y; } /** Calculates cross product of two points. @return CGFloat @since v0.7.2 */ static inline CGFloat ccpCross(const CCPoint v1, const CCPoint v2)// 计算两个向量的叉乘积 { return v1.x*v2.y - v1.y*v2.x; } /** Calculates perpendicular of v, rotated 90 degrees counter-clockwise -- cross(v, perp(v)) >= 0 @return CCPoint @since v0.7.2 */ static inline CCPoint ccpPerp(const CCPoint v)// 向量逆时针旋转后的点坐标 { return ccp(-v.y, v.x); } /** Calculates perpendicular of v, rotated 90 degrees clockwise -- cross(v, rperp(v)) <= 0 @return CCPoint @since v0.7.2 */ static inline CCPoint ccpRPerp(const CCPoint v)// 向量顺时针旋转后的点坐标 { return ccp(v.y, -v.x); } /** Calculates the projection of v1 over v2. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpProject(const CCPoint v1, const CCPoint v2)// 计算向量V1在向量V2上的投影点 { return ccpMult(v2, ccpDot(v1, v2)/ccpDot(v2, v2)); } /** Rotates two points. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpRotate(const CCPoint v1, const CCPoint v2) { return ccp(v1.x*v2.x - v1.y*v2.y, v1.x*v2.y + v1.y*v2.x); } /** Unrotates two points. @return CCPoint @since v0.7.2 */ static inline CCPoint ccpUnrotate(const CCPoint v1, const CCPoint v2) { return ccp(v1.x*v2.x + v1.y*v2.y, v1.y*v2.x - v1.x*v2.y); } /** Calculates the square length of a CCPoint (not calling sqrt() ) @return CGFloat @since v0.7.2 */ static inline CGFloat ccpLengthSQ(const CCPoint v)// 计算一个向量长度的平方值 { return ccpDot(v, v); } /** Calculates distance between point an origin @return CGFloat @since v0.7.2 */ CGFloat ccpLength(const CCPoint v);// 计算点和原点的距离,但不知道函数体在哪里 /** Calculates the distance between two points @return CGFloat @since v0.7.2 */ CGFloat ccpDistance(const CCPoint v1, const CCPoint v2);// 两点间距离 /** Returns point multiplied to a length of 1. @return CCPoint @since v0.7.2 */ CCPoint ccpNormalize(const CCPoint v); /** Converts radians to a normalized vector. @return CCPoint @since v0.7.2 */ CCPoint ccpForAngle(const CGFloat a); /** Converts a vector to radians. @return CGFloat @since v0.7.2 */ CGFloat ccpToAngle(const CCPoint v); /** Clamp a value between from and to. @since v0.99.1 */ float clampf(float value, float min_inclusive, float max_inclusive); /** Clamp a point between from and to. @since v0.99.1 */ CCPoint ccpClamp(CCPoint p, CCPoint from, CCPoint to); /** Quickly convert CGSize to a CCPoint @since v0.99.1 */ CCPoint ccpFromSize(CGSize s); /** Run a math operation function on each point component * absf, fllorf, ceilf, roundf * any function that has the signature: float func(float); * For example: let's try to take the floor of x,y * ccpCompOp(p,floorf); @since v0.99.1 */ CCPoint ccpCompOp(CCPoint p, float (*opFunc)(float)); /** Linear Interpolation between two points a and b @returns alpha == 0 ? a alpha == 1 ? b otherwise a value between a..b @since v0.99.1 */ CCPoint ccpLerp(CCPoint a, CCPoint b, float alpha); /** @returns if points have fuzzy equality which means equal with some degree of variance. @since v0.99.1 */ BOOL ccpFuzzyEqual(CCPoint a, CCPoint b, float variance); /** Multiplies a nd b components, a.x*b.x, a.y*b.y @returns a component-wise multiplication @since v0.99.1 */ CCPoint ccpCompMult(CCPoint a, CCPoint b); /** @returns the signed angle in radians between two vector directions @since v0.99.1 */ float ccpAngleSigned(CCPoint a, CCPoint b); /** @returns the angle in radians between two vector directions @since v0.99.1 */ float ccpAngle(CCPoint a, CCPoint b); /** Rotates a point counter clockwise by the angle around a pivot @param v is the point to rotate @param pivot is the pivot, naturally @param angle is the angle of rotation cw in radians @returns the rotated point @since v0.99.1 */ CCPoint ccpRotateByAngle(CCPoint v, CCPoint pivot, float angle); /** A general line-line intersection test @param p1 is the startpoint for the first line P1 = (p1 - p2) @param p2 is the endpoint for the first line P1 = (p1 - p2) @param p3 is the startpoint for the second line P2 = (p3 - p4) @param p4 is the endpoint for the second line P2 = (p3 - p4) @param s is the range for a hitpoint in P1 (pa = p1 + s*(p2 - p1)) @param t is the range for a hitpoint in P3 (pa = p2 + t*(p4 - p3)) @return bool indicating successful intersection of a line note that to truly test intersection for segments we have to make sure that s & t lie within [0..1] and for rays, make sure s & t > 0 the hit point is p3 + t * (p4 - p3); the hit point also is p1 + s * (p2 - p1); @since v0.99.1 */ BOOL ccpLineIntersect(CCPoint p1, CCPoint p2, CCPoint p3, CCPoint p4, float *s, float *t); /* ccpSegmentIntersect returns YES if Segment A-B intersects with segment C-D @since v1.0.0 */ BOOL ccpSegmentIntersect(CCPoint A, CCPoint B, CCPoint C, CCPoint D); /* ccpIntersectPoint returns the intersection point of line A-B, C-D @since v1.0.0 */ CCPoint ccpIntersectPoint(CCPoint A, CCPoint B, CCPoint C, CCPoint D);