1 /**************************************************************************** 2 Copyright (c) 2008-2010 Ricardo Quesada 3 Copyright (c) 2011-2012 cocos2d-x.org 4 Copyright (c) 2013-2014 Chukong Technologies Inc. 5 6 http://www.cocos2d-x.org 7 8 Permission is hereby granted, free of charge, to any person obtaining a copy 9 of this software and associated documentation files (the "Software"), to deal 10 in the Software without restriction, including without limitation the rights 11 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 copies of the Software, and to permit persons to whom the Software is 13 furnished to do so, subject to the following conditions: 14 15 The above copyright notice and this permission notice shall be included in 16 all copies or substantial portions of the Software. 17 18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 THE SOFTWARE. 25 ****************************************************************************/ 26 27 /** 28 * cc.Point is the class for point object, please do not use its constructor to create points, use cc.p() alias function instead. 29 * @class cc.Point 30 * @param {Number} x 31 * @param {Number} y 32 * @see cc.p 33 */ 34 cc.Point = function (x, y) { 35 this.x = x || 0; 36 this.y = y || 0; 37 }; 38 39 /** 40 * Helper function that creates a cc.Point. 41 * @function 42 * @param {Number|cc.Point} x a Number or a size object 43 * @param {Number} y 44 * @return {cc.Point} 45 * @example 46 * var point1 = cc.p(); 47 * var point2 = cc.p(100, 100); 48 * var point3 = cc.p(point2); 49 * var point4 = cc.p({x: 100, y: 100}); 50 */ 51 cc.p = function (x, y) { 52 // This can actually make use of "hidden classes" in JITs and thus decrease 53 // memory usage and overall performance drastically 54 // return cc.p(x, y); 55 // but this one will instead flood the heap with newly allocated hash maps 56 // giving little room for optimization by the JIT, 57 // note: we have tested this item on Chrome and firefox, it is faster than cc.p(x, y) 58 if (x === undefined) 59 return {x: 0, y: 0}; 60 if (y === undefined) 61 return {x: x.x, y: x.y}; 62 return {x: x, y: y}; 63 }; 64 65 /** 66 * Check whether a point's value equals to another 67 * @function 68 * @param {cc.Point} point1 69 * @param {cc.Point} point2 70 * @return {Boolean} 71 */ 72 cc.pointEqualToPoint = function (point1, point2) { 73 return point1 && point2 && (point1.x === point2.x) && (point1.y === point2.y); 74 }; 75 76 77 /** 78 * cc.Size is the class for size object, please do not use its constructor to create sizes, use cc.size() alias function instead. 79 * @class cc.Size 80 * @param {Number} width 81 * @param {Number} height 82 * @see cc.size 83 */ 84 cc.Size = function (width, height) { 85 this.width = width || 0; 86 this.height = height || 0; 87 }; 88 89 /** 90 * Helper function that creates a cc.Size. 91 * @function 92 * @param {Number|cc.Size} w width or a size object 93 * @param {Number} h height 94 * @return {cc.Size} 95 * @example 96 * var size1 = cc.size(); 97 * var size2 = cc.size(100,100); 98 * var size3 = cc.size(size2); 99 * var size4 = cc.size({width: 100, height: 100}); 100 */ 101 cc.size = function (w, h) { 102 // This can actually make use of "hidden classes" in JITs and thus decrease 103 // memory usage and overall performance drastically 104 //return cc.size(w, h); 105 // but this one will instead flood the heap with newly allocated hash maps 106 // giving little room for optimization by the JIT 107 // note: we have tested this item on Chrome and firefox, it is faster than cc.size(w, h) 108 if (w === undefined) 109 return {width: 0, height: 0}; 110 if (h === undefined) 111 return {width: w.width, height: w.height}; 112 return {width: w, height: h}; 113 }; 114 115 /** 116 * Check whether a point's value equals to another 117 * @function 118 * @param {cc.Size} size1 119 * @param {cc.Size} size2 120 * @return {Boolean} 121 */ 122 cc.sizeEqualToSize = function (size1, size2) { 123 return (size1 && size2 && (size1.width === size2.width) && (size1.height === size2.height)); 124 }; 125 126 127 /** 128 * cc.Rect is the class for rect object, please do not use its constructor to create rects, use cc.rect() alias function instead. 129 * @class cc.Rect 130 * @param {Number} width 131 * @param {Number} height 132 * @see cc.rect 133 */ 134 cc.Rect = function (x, y, width, height) { 135 this.x = x||0; 136 this.y = y||0; 137 this.width = width||0; 138 this.height = height||0; 139 }; 140 141 /** 142 * Helper function that creates a cc.Rect. 143 * @function 144 * @param {Number|cc.Rect} x a number or a rect object 145 * @param {Number} y 146 * @param {Number} w 147 * @param {Number} h 148 * @returns {cc.Rect} 149 * @example 150 * var rect1 = cc.rect(); 151 * var rect2 = cc.rect(100,100,100,100); 152 * var rect3 = cc.rect(rect2); 153 * var rect4 = cc.rect({x: 100, y: 100, width: 100, height: 100}); 154 */ 155 cc.rect = function (x, y, w, h) { 156 if (x === undefined) 157 return {x: 0, y: 0, width: 0, height: 0}; 158 if (y === undefined) 159 return {x: x.x, y: x.y, width: x.width, height: x.height}; 160 return {x: x, y: y, width: w, height: h }; 161 }; 162 163 /** 164 * Check whether a rect's value equals to another 165 * @function 166 * @param {cc.Rect} rect1 167 * @param {cc.Rect} rect2 168 * @return {Boolean} 169 */ 170 cc.rectEqualToRect = function (rect1, rect2) { 171 return rect1 && rect2 && (rect1.x === rect2.x) && (rect1.y === rect2.y) && (rect1.width === rect2.width) && (rect1.height === rect2.height); 172 }; 173 174 cc._rectEqualToZero = function(rect){ 175 return rect && (rect.x === 0) && (rect.y === 0) && (rect.width === 0) && (rect.height === 0); 176 }; 177 178 /** 179 * Check whether the rect1 contains rect2 180 * @function 181 * @param {cc.Rect} rect1 182 * @param {cc.Rect} rect2 183 * @return {Boolean} 184 */ 185 cc.rectContainsRect = function (rect1, rect2) { 186 if (!rect1 || !rect2) 187 return false; 188 return !((rect1.x >= rect2.x) || (rect1.y >= rect2.y) || 189 ( rect1.x + rect1.width <= rect2.x + rect2.width) || 190 ( rect1.y + rect1.height <= rect2.y + rect2.height)); 191 }; 192 193 /** 194 * Returns the rightmost x-value of a rect 195 * @function 196 * @param {cc.Rect} rect 197 * @return {Number} The rightmost x value 198 */ 199 cc.rectGetMaxX = function (rect) { 200 return (rect.x + rect.width); 201 }; 202 203 /** 204 * Return the midpoint x-value of a rect 205 * @function 206 * @param {cc.Rect} rect 207 * @return {Number} The midpoint x value 208 */ 209 cc.rectGetMidX = function (rect) { 210 return (rect.x + rect.width / 2.0); 211 }; 212 /** 213 * Returns the leftmost x-value of a rect 214 * @function 215 * @param {cc.Rect} rect 216 * @return {Number} The leftmost x value 217 */ 218 cc.rectGetMinX = function (rect) { 219 return rect.x; 220 }; 221 222 /** 223 * Return the topmost y-value of a rect 224 * @function 225 * @param {cc.Rect} rect 226 * @return {Number} The topmost y value 227 */ 228 cc.rectGetMaxY = function (rect) { 229 return(rect.y + rect.height); 230 }; 231 232 /** 233 * Return the midpoint y-value of `rect' 234 * @function 235 * @param {cc.Rect} rect 236 * @return {Number} The midpoint y value 237 */ 238 cc.rectGetMidY = function (rect) { 239 return rect.y + rect.height / 2.0; 240 }; 241 242 /** 243 * Return the bottommost y-value of a rect 244 * @function 245 * @param {cc.Rect} rect 246 * @return {Number} The bottommost y value 247 */ 248 cc.rectGetMinY = function (rect) { 249 return rect.y; 250 }; 251 252 /** 253 * Check whether a rect contains a point 254 * @function 255 * @param {cc.Rect} rect 256 * @param {cc.Point} point 257 * @return {Boolean} 258 */ 259 cc.rectContainsPoint = function (rect, point) { 260 return (point.x >= cc.rectGetMinX(rect) && point.x <= cc.rectGetMaxX(rect) && 261 point.y >= cc.rectGetMinY(rect) && point.y <= cc.rectGetMaxY(rect)) ; 262 }; 263 264 /** 265 * Check whether a rect intersect with another 266 * @function 267 * @param {cc.Rect} rectA 268 * @param {cc.Rect} rectB 269 * @return {Boolean} 270 */ 271 cc.rectIntersectsRect = function (ra, rb) { 272 var maxax = ra.x + ra.width, 273 maxay = ra.y + ra.height, 274 maxbx = rb.x + rb.width, 275 maxby = rb.y + rb.height; 276 return !(maxax < rb.x || maxbx < ra.x || maxay < rb.y || maxby < ra.y); 277 }; 278 279 /** 280 * Check whether a rect overlaps another 281 * @function 282 * @param {cc.Rect} rectA 283 * @param {cc.Rect} rectB 284 * @return {Boolean} 285 */ 286 cc.rectOverlapsRect = function (rectA, rectB) { 287 return !((rectA.x + rectA.width < rectB.x) || 288 (rectB.x + rectB.width < rectA.x) || 289 (rectA.y + rectA.height < rectB.y) || 290 (rectB.y + rectB.height < rectA.y)); 291 }; 292 293 /** 294 * Returns the smallest rectangle that contains the two source rectangles. 295 * @function 296 * @param {cc.Rect} rectA 297 * @param {cc.Rect} rectB 298 * @return {cc.Rect} 299 */ 300 cc.rectUnion = function (rectA, rectB) { 301 var rect = cc.rect(0, 0, 0, 0); 302 rect.x = Math.min(rectA.x, rectB.x); 303 rect.y = Math.min(rectA.y, rectB.y); 304 rect.width = Math.max(rectA.x + rectA.width, rectB.x + rectB.width) - rect.x; 305 rect.height = Math.max(rectA.y + rectA.height, rectB.y + rectB.height) - rect.y; 306 return rect; 307 }; 308 309 /** 310 * Returns the overlapping portion of 2 rectangles 311 * @function 312 * @param {cc.Rect} rectA 313 * @param {cc.Rect} rectB 314 * @return {cc.Rect} 315 */ 316 cc.rectIntersection = function (rectA, rectB) { 317 var intersection = cc.rect( 318 Math.max(cc.rectGetMinX(rectA), cc.rectGetMinX(rectB)), 319 Math.max(cc.rectGetMinY(rectA), cc.rectGetMinY(rectB)), 320 0, 0); 321 322 intersection.width = Math.min(cc.rectGetMaxX(rectA), cc.rectGetMaxX(rectB)) - cc.rectGetMinX(intersection); 323 intersection.height = Math.min(cc.rectGetMaxY(rectA), cc.rectGetMaxY(rectB)) - cc.rectGetMinY(intersection); 324 return intersection; 325 }; 326 327 328