scichart
Version:
Fast WebGL JavaScript Charting Library and Framework
170 lines (169 loc) • 9.39 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.calcDistanceFromLineSegment = exports.calcDotProduct = exports.testIsInInterval = exports.testIsInXBounds = exports.calcAnnotationBordersForAxisMarker = exports.testIsInBounds = exports.calcDistance = exports.calcCrossProduct = exports.calcDistanceFromLine = void 0;
var AxisAlignment_1 = require("../types/AxisAlignment");
var calcDistanceFromLine = function (x, y, startX, startY, endX, endY) {
return Math.abs((0, exports.calcCrossProduct)(startX, startY, endX, endY, x, y) / (0, exports.calcDistance)(startX, startY, endX, endY));
};
exports.calcDistanceFromLine = calcDistanceFromLine;
var calcCrossProduct = function (xA, yA, xB, yB, xC, yC) {
return (xB - xA) * (yC - yA) - (yB - yA) * (xC - xA);
};
exports.calcCrossProduct = calcCrossProduct;
var calcDistance = function (x1, y1, x2, y2) {
var diffX = x1 - x2;
var diffY = y1 - y2;
return Math.sqrt(diffX * diffX + diffY * diffY);
};
exports.calcDistance = calcDistance;
/** Tests whether a point is within rectangle bounds */
var testIsInBounds = function (x, y, left, bottom, right, top, radius) {
if (radius === void 0) { radius = 0; }
return isBetween(x, left - radius, right + radius) && isBetween(y, top + radius, bottom - radius);
};
exports.testIsInBounds = testIsInBounds;
/** Returns whether a number is in the range of 2 other numbers, regardless if ascending or descending */
var isBetween = function (value, start, end) {
return (value >= start && value <= end) || (value >= end && value <= start);
};
/**
* Calculates annotation borders for {@link AxisMarkerAnnotation}
* @param isVerticalChart the vertical chart flag
* @param x1 the X1 data value of the annotation
* @param y1 the Y1 data value of the annotation
* @param horizontalAxis the horizontal axis
* @param verticalAxis the vertical axis
* @param textureWidth the texture width
* @param viewRect the seriesViewRect
* @param xPosition the X position of the texture on the SciChartSurface, the left-top corner position on the canvas
* @param yPosition the Y position of the texture on the SciChartSurface, the left-top corner position on the canvas
* @param textureHeight the texture width
* @param annotationMarginXDirection the texture margin in X direction
* @param annotationMarginYDirection the texture margin in Y direction
* @param isHorizontalAxisAlignmentReversed if true EAxisAlignment.Top, otherwise EAxisAlignment.Bottom
* @param isVerticalAxisAlignmentReversed if true EAxisAlignment.Left, otherwise EAxisAlignment.Right
*/
var calcAnnotationBordersForAxisMarker = function (isVerticalChart, x1, y1, horizontalAxis, verticalAxis, textureWidth, viewRect, xPosition, yPosition, textureHeight, annotationMarginXDirection, annotationMarginYDirection, isHorizontalAxisAlignmentReversed, isVerticalAxisAlignmentReversed) {
var annotationBorders = { x1: 0, x2: 0, y1: 0, y2: 0 };
if (isVerticalChart) {
if (x1) {
if (horizontalAxis.axisAlignment === AxisAlignment_1.EAxisAlignment.Top) {
if (verticalAxis.axisAlignment === AxisAlignment_1.EAxisAlignment.Left) {
annotationBorders.x1 = textureWidth - viewRect.y;
annotationBorders.y1 = yPosition - viewRect.y;
annotationBorders.x2 = 0;
annotationBorders.y2 = yPosition + textureHeight - viewRect.y;
}
else if (verticalAxis.axisAlignment === AxisAlignment_1.EAxisAlignment.Right) {
annotationBorders.x1 = viewRect.width - textureWidth + viewRect.y;
annotationBorders.y1 = yPosition - viewRect.y;
annotationBorders.x2 = viewRect.width;
annotationBorders.y2 = yPosition + textureHeight - viewRect.y;
}
}
else {
if (verticalAxis.axisAlignment === AxisAlignment_1.EAxisAlignment.Left) {
annotationBorders.x1 = textureWidth - viewRect.x + annotationMarginXDirection;
annotationBorders.y1 = yPosition - viewRect.y;
annotationBorders.x2 = 0;
annotationBorders.y2 = yPosition + textureHeight - viewRect.y;
}
else if (verticalAxis.axisAlignment === AxisAlignment_1.EAxisAlignment.Right) {
annotationBorders.x1 = xPosition - annotationMarginXDirection;
annotationBorders.y1 = yPosition - viewRect.y;
annotationBorders.x2 = viewRect.width;
annotationBorders.y2 = yPosition + textureHeight - viewRect.y;
}
}
}
else if (y1) {
if (horizontalAxis.axisAlignment === AxisAlignment_1.EAxisAlignment.Top) {
annotationBorders.x1 = xPosition + textureWidth / 2 - viewRect.x + annotationMarginYDirection;
annotationBorders.y1 = textureHeight - viewRect.y + annotationMarginYDirection;
annotationBorders.x2 = xPosition - textureWidth / 2 - viewRect.x + annotationMarginYDirection;
annotationBorders.y2 = 0;
}
else {
annotationBorders.x1 = xPosition - textureWidth / 2 - viewRect.x + annotationMarginYDirection;
annotationBorders.y1 = yPosition - annotationMarginYDirection;
annotationBorders.x2 = xPosition + textureWidth / 2 - viewRect.x + annotationMarginYDirection;
annotationBorders.y2 = viewRect.height;
}
}
}
else {
if (x1) {
if (isHorizontalAxisAlignmentReversed) {
annotationBorders.x1 = xPosition - textureWidth / 2 + annotationMarginYDirection;
annotationBorders.y1 = yPosition + textureHeight - viewRect.y;
annotationBorders.x2 = xPosition + textureWidth / 2;
annotationBorders.y2 = yPosition;
}
else if (isVerticalAxisAlignmentReversed) {
annotationBorders.x1 = xPosition - textureWidth / 2 + annotationMarginXDirection - viewRect.x;
annotationBorders.y1 = yPosition - annotationMarginXDirection;
annotationBorders.x2 = xPosition + textureWidth / 2 + annotationMarginXDirection - viewRect.x;
annotationBorders.y2 = viewRect.height;
}
else {
annotationBorders.x1 = xPosition - textureWidth / 2 - annotationMarginYDirection;
annotationBorders.y1 = yPosition - annotationMarginXDirection;
annotationBorders.x2 = xPosition + textureWidth / 2 - annotationMarginYDirection;
annotationBorders.y2 = yPosition + textureHeight - viewRect.y;
}
}
else if (y1) {
if (isVerticalAxisAlignmentReversed) {
annotationBorders.x1 = textureWidth - viewRect.x + annotationMarginYDirection;
annotationBorders.y1 = yPosition - textureHeight / 2;
annotationBorders.x2 = 0;
annotationBorders.y2 = yPosition + textureHeight / 2;
}
else {
annotationBorders.x1 = xPosition - annotationMarginYDirection;
annotationBorders.y1 = yPosition - textureHeight / 2 - annotationMarginXDirection;
annotationBorders.x2 = xPosition + textureWidth;
annotationBorders.y2 = yPosition + textureHeight / 2 - annotationMarginXDirection;
}
}
}
return annotationBorders;
};
exports.calcAnnotationBordersForAxisMarker = calcAnnotationBordersForAxisMarker;
var testIsInXBounds = function (xHitTestPoint, xDataPointCoord, maxDistance) {
var distance = Math.abs(xHitTestPoint - xDataPointCoord);
return distance < maxDistance;
};
exports.testIsInXBounds = testIsInXBounds;
/**
* Tests if X is within radius from the [intervalStart, intervalEnd] interval,
* intervalStart, intervalEnd values might not be sorted
* @param x
* @param intervalStart
* @param intervalEnd
* @param radius
*/
var testIsInInterval = function (x, intervalStart, intervalEnd, radius) {
if (radius === void 0) { radius = 0; }
if (intervalStart <= intervalEnd) {
return intervalStart - radius <= x && x <= intervalEnd + radius;
}
else {
return intervalEnd - radius <= x && x <= intervalStart + radius;
}
};
exports.testIsInInterval = testIsInInterval;
var calcDotProduct = function (v1x, v1y, v2x, v2y, v3x, v3y) {
return (v2x - v1x) * (v3x - v2x) + (v2y - v1y) * (v3y - v2y);
};
exports.calcDotProduct = calcDotProduct;
var calcDistanceFromLineSegment = function (x, y, startX, startY, endX, endY) {
if ((0, exports.calcDotProduct)(startX, startY, endX, endY, x, y) > 0) {
return (0, exports.calcDistance)(endX, endY, x, y);
}
if ((0, exports.calcDotProduct)(endX, endY, startX, startY, x, y) > 0) {
return (0, exports.calcDistance)(startX, startY, x, y);
}
return (0, exports.calcDistanceFromLine)(x, y, startX, startY, endX, endY);
};
exports.calcDistanceFromLineSegment = calcDistanceFromLineSegment;
;