| import Point from './Point.js'; | 
| var extent = [0, 0]; | 
| var extent2 = [0, 0]; | 
| var minTv = new Point(); | 
| var maxTv = new Point(); | 
| var OrientedBoundingRect = (function () { | 
|     function OrientedBoundingRect(rect, transform) { | 
|         this._corners = []; | 
|         this._axes = []; | 
|         this._origin = [0, 0]; | 
|         for (var i = 0; i < 4; i++) { | 
|             this._corners[i] = new Point(); | 
|         } | 
|         for (var i = 0; i < 2; i++) { | 
|             this._axes[i] = new Point(); | 
|         } | 
|         if (rect) { | 
|             this.fromBoundingRect(rect, transform); | 
|         } | 
|     } | 
|     OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) { | 
|         var corners = this._corners; | 
|         var axes = this._axes; | 
|         var x = rect.x; | 
|         var y = rect.y; | 
|         var x2 = x + rect.width; | 
|         var y2 = y + rect.height; | 
|         corners[0].set(x, y); | 
|         corners[1].set(x2, y); | 
|         corners[2].set(x2, y2); | 
|         corners[3].set(x, y2); | 
|         if (transform) { | 
|             for (var i = 0; i < 4; i++) { | 
|                 corners[i].transform(transform); | 
|             } | 
|         } | 
|         Point.sub(axes[0], corners[1], corners[0]); | 
|         Point.sub(axes[1], corners[3], corners[0]); | 
|         axes[0].normalize(); | 
|         axes[1].normalize(); | 
|         for (var i = 0; i < 2; i++) { | 
|             this._origin[i] = axes[i].dot(corners[0]); | 
|         } | 
|     }; | 
|     OrientedBoundingRect.prototype.intersect = function (other, mtv) { | 
|         var overlapped = true; | 
|         var noMtv = !mtv; | 
|         minTv.set(Infinity, Infinity); | 
|         maxTv.set(0, 0); | 
|         if (!this._intersectCheckOneSide(this, other, minTv, maxTv, noMtv, 1)) { | 
|             overlapped = false; | 
|             if (noMtv) { | 
|                 return overlapped; | 
|             } | 
|         } | 
|         if (!this._intersectCheckOneSide(other, this, minTv, maxTv, noMtv, -1)) { | 
|             overlapped = false; | 
|             if (noMtv) { | 
|                 return overlapped; | 
|             } | 
|         } | 
|         if (!noMtv) { | 
|             Point.copy(mtv, overlapped ? minTv : maxTv); | 
|         } | 
|         return overlapped; | 
|     }; | 
|     OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) { | 
|         var overlapped = true; | 
|         for (var i = 0; i < 2; i++) { | 
|             var axis = this._axes[i]; | 
|             this._getProjMinMaxOnAxis(i, self._corners, extent); | 
|             this._getProjMinMaxOnAxis(i, other._corners, extent2); | 
|             if (extent[1] < extent2[0] || extent[0] > extent2[1]) { | 
|                 overlapped = false; | 
|                 if (noMtv) { | 
|                     return overlapped; | 
|                 } | 
|                 var dist0 = Math.abs(extent2[0] - extent[1]); | 
|                 var dist1 = Math.abs(extent[0] - extent2[1]); | 
|                 if (Math.min(dist0, dist1) > maxTv.len()) { | 
|                     if (dist0 < dist1) { | 
|                         Point.scale(maxTv, axis, -dist0 * inverse); | 
|                     } | 
|                     else { | 
|                         Point.scale(maxTv, axis, dist1 * inverse); | 
|                     } | 
|                 } | 
|             } | 
|             else if (minTv) { | 
|                 var dist0 = Math.abs(extent2[0] - extent[1]); | 
|                 var dist1 = Math.abs(extent[0] - extent2[1]); | 
|                 if (Math.min(dist0, dist1) < minTv.len()) { | 
|                     if (dist0 < dist1) { | 
|                         Point.scale(minTv, axis, dist0 * inverse); | 
|                     } | 
|                     else { | 
|                         Point.scale(minTv, axis, -dist1 * inverse); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|         return overlapped; | 
|     }; | 
|     OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) { | 
|         var axis = this._axes[dim]; | 
|         var origin = this._origin; | 
|         var proj = corners[0].dot(axis) + origin[dim]; | 
|         var min = proj; | 
|         var max = proj; | 
|         for (var i = 1; i < corners.length; i++) { | 
|             var proj_1 = corners[i].dot(axis) + origin[dim]; | 
|             min = Math.min(proj_1, min); | 
|             max = Math.max(proj_1, max); | 
|         } | 
|         out[0] = min; | 
|         out[1] = max; | 
|     }; | 
|     return OrientedBoundingRect; | 
| }()); | 
| export default OrientedBoundingRect; |