'use strict';
(function (scope) {
/**
* The mathUtil class is use to calculate lines
*
* @class MathUtil
* @constructor
*/
function MathUtils() {
}
/**
* This method is use to calculate the size of the rectangle that contains an ellipse arc.
*
* @method getEllipseArcRect
* @param {Point} center
* @param {Number} maxRadius
* @param {Number} minRadius
* @param {Number} orientation
* @param {Number} startAngle
* @param {Number} sweepAngle
* @returns {Rectangle}
*/
MathUtils.getEllipseArcRect = function (center, maxRadius, minRadius, orientation, startAngle, sweepAngle) {
var angleStep = 0.02, // angle delta between interpolated points on the arc, in radian
angle, // angle
alpha, // angle
z1,
z2,
z3,
z4,
cosAlpha,
sinAlpha,
n,
xList,
yList,
i,
x,
y,
xMin,
xMax,
yMin,
yMax,
sortFloat = function (a, b) {
return a - b;
};
z1 = z2 = Math.cos(orientation);
z3 = z4 = Math.sin(orientation);
z1 *= maxRadius;
z2 *= minRadius;
z3 *= maxRadius;
z4 *= minRadius;
n = Math.abs(sweepAngle) / angleStep;
xList = [];
yList = [];
for (i = 0; i <= n; i++) {
angle = startAngle + (i / n) * sweepAngle;
alpha = Math.atan2(Math.sin(angle) / minRadius, Math.cos(angle) / maxRadius);
cosAlpha = Math.cos(alpha);
sinAlpha = Math.sin(alpha);
// current point
x = center.x + z1 * cosAlpha - z4 * sinAlpha;
y = center.y + z2 * sinAlpha + z3 * cosAlpha;
xList.push(x);
yList.push(y);
}
xList.sort(sortFloat);
yList.sort(sortFloat);
xMin = xList[0];
xMax = xList[xList.length - 1];
yMin = yList[0];
yMax = yList[yList.length - 1];
return new scope.Rectangle({x: xMin, y: yMin, width: xMax - xMin, height: yMax - yMin});
};
/**
* This method is use to calculate the size of the rectangle that contains a line.
*
* @method getLineRect
* @param {Point} firstPoint
* @param {Point} lastPoint
* @returns {Rectangle}
*/
MathUtils.getLineRect = function (firstPoint, lastPoint) {
var xFirst = firstPoint.x,
xLast = lastPoint.x,
xMin = Math.min(xFirst, xLast),
xMax = Math.max(xFirst, xLast),
yFirst = firstPoint.y,
yLast = lastPoint.y,
yMin = Math.min(yFirst, yLast),
yMax = Math.max(yFirst, yLast);
return new scope.Rectangle({x: xMin, y: yMin, width: xMax - xMin, height: yMax - yMin});
};
/**
* This method is use to calculate the size of the rectangle that contains bounding boxes.
*
* @method getBoundingRect
* @param {Rectangle[]} boundingBoxes List of bounding box
* @returns {Rectangle}
*/
MathUtils.getBoundingRect = function (boundingBoxes) {
var xList = [],
yList = [];
for (var i in boundingBoxes) {
var rectangle = boundingBoxes[i];
xList.push(rectangle.getX());
xList.push(rectangle.getX() + rectangle.getWidth());
yList.push(rectangle.getY());
yList.push(rectangle.getY() + rectangle.getHeight());
}
var xMin = Math.min.apply(Math, xList);
var xMax = Math.max.apply(Math, xList);
var yMin = Math.min.apply(Math, yList);
var yMax = Math.max.apply(Math, yList);
return new scope.Rectangle({x: xMin, y: yMin, width: xMax - xMin, height: yMax - yMin});
};
// Export
scope.MathUtils = MathUtils;
})(MyScript);