Math = math Math.E = 2.718281828459045 -- 自然数 Math.LN2 = 0.6931471805599453 -- 2的自然对数 Math.LN10 = 2.302585092994046 -- 10的自然对数 Math.LOG2E = 1.4426950408889634 -- log 2 为底的自然数 Math.LOG10E = 0.4342944819032518 -- log 10 为底的自然数 Math.PI = 3.141592653589793 -- π Math.HALF_PI = 1.57079632679489661923 -- 1/2 π Math.SQRT1_2 = 0.7071067811865476 -- 1/2的平方根 Math.SQRT2 = 1.4142135623730951 -- 2的平方根 -- p, q is on the same of line 1 function Math.isSame(line1, p, q) local dx = line1.endPoint.x - line1.startPoint.x; local dy = line1.endPoint.y - line1.startPoint.y; local dx1 = p.x - line1.startPoint.x; local dy1 = p.y - line1.startPoint.y; local dx2 = q.x - line1.endPoint.x; local dy2 = q.y - line1.endPoint.y; return (dx*dy1-dy*dx1)*(dx*dy2-dy*dx2) > 0; end -- 2 line segments (s1, s2) are intersect? function Math.isIntersect(line1, line2) local b1 = Math.isSame(line1, line2.startPoint, line2.endPoint); local b2 = Math.isSame(line2, line1.startPoint, line1.endPoint); return not b1 and not b2; end function Math.round(num) return math.floor(num + 0.5) end function Math.angle2Radian(angle) return angle*math.pi/180 end function Math.radian2Angle(radian) return radian/math.pi*180 end -- 从球面坐标系(半径,经度,纬度)转换到笛卡尔坐标系(XYZ) -- 半径,离原点的距离,一般是一个正数 -- 经度,0~2PI,0代表正前方,PI代表正后方 -- 纬度,HALF_PI代表水平位置,+PI代表底,0代表顶 function Math.SphericalToCartesian(sphericalPos) return { x = sphericalPos.x * math.cos(sphericalPos.y) * math.sin(sphericalPos.z); z = sphericalPos.x * math.sin(sphericalPos.y) * math.sin(sphericalPos.z); y = sphericalPos.x * math.cos(sphericalPos.z); } end -- 从笛卡尔坐标系(XYZ)转换到球面坐标系(半径,经度,纬度) function Math.CartesianToSpherical(cartesianPos) local r = math.sqrt(cartesianPos.x * cartesianPos.x + cartesianPos.y * cartesianPos.y + cartesianPos.z * cartesianPos.z) local lon = math.atan2(cartesianPos.z, cartesianPos.x) local lat = math.acos(cartesianPos.y / r) return cc.vec3(r, lon, lat) end