UNPKG

scichart

Version:

Fast WebGL JavaScript Charting Library and Framework

160 lines (159 loc) 10.3 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.LineSegmentSeriesHitTestProvider = void 0; var IDataSeries_1 = require("../../../Model/IDataSeries"); var BaseHitTestProvider_1 = require("./BaseHitTestProvider"); var hitTestHelpers_1 = require("./hitTestHelpers"); var HitTestInfo_1 = require("./HitTestInfo"); /** * Hit-test provider for {@link BaseLineRenderableSeries}. See base class {@link BaseHitTestProvider} for further info */ var LineSegmentSeriesHitTestProvider = /** @class */ (function (_super) { __extends(LineSegmentSeriesHitTestProvider, _super); function LineSegmentSeriesHitTestProvider() { return _super !== null && _super.apply(this, arguments) || this; } /** * @inheritDoc */ LineSegmentSeriesHitTestProvider.prototype.hitTest = function (x, y, hitTestRadius) { if (hitTestRadius === void 0) { hitTestRadius = BaseHitTestProvider_1.BaseHitTestProvider.DEFAULT_HIT_TEST_RADIUS; } var dataSeriesType = this.parentSeries.dataSeries.type; if (dataSeriesType === IDataSeries_1.EDataSeriesType.Xyxy) { return this.hitTestXyXy(x, y, hitTestRadius); } else { return this.hitTestXy(x, y, hitTestRadius); } }; /** * Hit-test logic for Xy data series * It is assumed the data is unsorted (general case) */ LineSegmentSeriesHitTestProvider.prototype.hitTestXy = function (x, y, hitTestRadius) { if (hitTestRadius === void 0) { hitTestRadius = BaseHitTestProvider_1.BaseHitTestProvider.DEFAULT_HIT_TEST_RADIUS; } var hitTestPoint = this.getTranslatedHitTestPoint(x, y); if (!hitTestPoint) return HitTestInfo_1.HitTestInfo.empty(); var _a = this.currentRenderPassData, xCoordinateCalculator = _a.xCoordinateCalculator, yCoordinateCalculator = _a.yCoordinateCalculator, isVerticalChart = _a.isVerticalChart; var xHitCoord = isVerticalChart ? hitTestPoint.y : hitTestPoint.x; var yHitCoord = isVerticalChart ? hitTestPoint.x : hitTestPoint.y; var dataSeries = this.parentSeries.dataSeries; if (!dataSeries) return HitTestInfo_1.HitTestInfo.empty(); var xNativeValues = dataSeries.getNativeXValues(); var yNativeValues = dataSeries.getNativeYValues(); var dataSeriesCount = xNativeValues.size(); if (dataSeriesCount < 2) return HitTestInfo_1.HitTestInfo.empty(); var getXFn = function (i) { return xNativeValues.get(2 * i); }; var getYFn = function (i) { return yNativeValues.get(2 * i); }; var getX1Fn = function (i) { return xNativeValues.get(2 * i + 1); }; var getY1Fn = function (i) { return yNativeValues.get(2 * i + 1); }; var _b = hitTestHelpers_1.hitTestHelpers.getNearestLineSegment(xCoordinateCalculator, yCoordinateCalculator, dataSeriesCount / 2, // passing half size, because X and X1 values alternate getXFn, getYFn, getX1Fn, getY1Fn, xHitCoord, yHitCoord, hitTestRadius), isHit = _b.isHit, isWithinDataBounds = _b.isWithinDataBounds, nearestPointIndex = _b.nearestPointIndex, nearestDistance = _b.nearestDistance; var firstPointIndex = nearestPointIndex >= 0 ? nearestPointIndex * 2 : -1; var hitTestInfo = hitTestHelpers_1.hitTestHelpers.createHitTestInfo(this.parentSeries, xCoordinateCalculator, yCoordinateCalculator, isVerticalChart, dataSeries, xNativeValues, yNativeValues, xHitCoord, yHitCoord, firstPointIndex, hitTestRadius, nearestDistance); if (firstPointIndex !== -1) { hitTestInfo.dataSeriesIndex = firstPointIndex; hitTestInfo.isWithinDataBounds = isWithinDataBounds; hitTestInfo.isHit = isHit; hitTestInfo.xValue = xNativeValues.get(firstPointIndex); hitTestInfo.xCoord = xCoordinateCalculator.getCoordinate(hitTestInfo.xValue); hitTestInfo.yValue = yNativeValues.get(firstPointIndex); hitTestInfo.yCoord = yCoordinateCalculator.getCoordinate(hitTestInfo.yValue); hitTestInfo.point2dataSeriesIndex = firstPointIndex + 1; hitTestInfo.point2xValue = xNativeValues.get(firstPointIndex + 1); hitTestInfo.point2xCoord = xCoordinateCalculator.getCoordinate(hitTestInfo.point2xValue); hitTestInfo.point2yValue = yNativeValues.get(firstPointIndex + 1); hitTestInfo.point2yCoord = yCoordinateCalculator.getCoordinate(hitTestInfo.point2yValue); hitTestInfo.point2metadata = dataSeries.getMetadataAt(firstPointIndex + 1); var point2yValueByName = dataSeries.valueNames.reduce(function (map, name) { map[name] = dataSeries.getNativeValue(dataSeries.getYValuesByName(name), hitTestInfo.point2dataSeriesIndex); return map; }, {}); hitTestInfo.point2yValueByName = point2yValueByName; } return hitTestInfo; }; /** * Hit-test logic for Xyxy (four vectors) data series * It is assumed the data is unsorted (general case) */ LineSegmentSeriesHitTestProvider.prototype.hitTestXyXy = function (x, y, hitTestRadius) { if (hitTestRadius === void 0) { hitTestRadius = BaseHitTestProvider_1.BaseHitTestProvider.DEFAULT_HIT_TEST_RADIUS; } var hitTestPoint = this.getTranslatedHitTestPoint(x, y); if (!hitTestPoint) return HitTestInfo_1.HitTestInfo.empty(); var _a = this.currentRenderPassData, xCoordinateCalculator = _a.xCoordinateCalculator, yCoordinateCalculator = _a.yCoordinateCalculator, isVerticalChart = _a.isVerticalChart; var xHitCoord = isVerticalChart ? hitTestPoint.y : hitTestPoint.x; var yHitCoord = isVerticalChart ? hitTestPoint.x : hitTestPoint.y; var dataSeries = this.parentSeries.dataSeries; if (!dataSeries) return HitTestInfo_1.HitTestInfo.empty(); var xNativeValues = dataSeries.getNativeXValues(); var yNativeValues = dataSeries.yValues; var x1NativeValues = dataSeries.x1Values; var y1NativeValues = dataSeries.y1Values; var dataSeriesCount = xNativeValues.size(); if (dataSeriesCount < 1) return HitTestInfo_1.HitTestInfo.empty(); var getXFn = function (i) { return xNativeValues.get(i); }; var getYFn = function (i) { return yNativeValues.get(i); }; var getX1Fn = function (i) { return x1NativeValues.get(i); }; var getY1Fn = function (i) { return y1NativeValues.get(i); }; var _b = hitTestHelpers_1.hitTestHelpers.getNearestLineSegment(xCoordinateCalculator, yCoordinateCalculator, dataSeriesCount, getXFn, getYFn, getX1Fn, getY1Fn, xHitCoord, yHitCoord, hitTestRadius), isHit = _b.isHit, isWithinDataBounds = _b.isWithinDataBounds, nearestPointIndex = _b.nearestPointIndex, nearestDistance = _b.nearestDistance; var hitTestInfo = hitTestHelpers_1.hitTestHelpers.createHitTestInfo(this.parentSeries, xCoordinateCalculator, yCoordinateCalculator, isVerticalChart, dataSeries, xNativeValues, yNativeValues, xHitCoord, yHitCoord, nearestPointIndex, hitTestRadius, nearestDistance); if (nearestPointIndex !== -1) { hitTestInfo.dataSeriesIndex = nearestPointIndex; hitTestInfo.isWithinDataBounds = isWithinDataBounds; hitTestInfo.isHit = isHit; hitTestInfo.xValue = xNativeValues.get(nearestPointIndex); hitTestInfo.xCoord = xCoordinateCalculator.getCoordinate(hitTestInfo.xValue); hitTestInfo.yValue = yNativeValues.get(nearestPointIndex); hitTestInfo.yCoord = yCoordinateCalculator.getCoordinate(hitTestInfo.yValue); hitTestInfo.point2dataSeriesIndex = nearestPointIndex; hitTestInfo.point2xValue = x1NativeValues.get(nearestPointIndex); hitTestInfo.point2xCoord = xCoordinateCalculator.getCoordinate(hitTestInfo.point2xValue); hitTestInfo.point2yValue = y1NativeValues.get(nearestPointIndex); hitTestInfo.point2yCoord = yCoordinateCalculator.getCoordinate(hitTestInfo.point2yValue); hitTestInfo.point2metadata = dataSeries.getMetadataAt(nearestPointIndex); var point2yValueByName = dataSeries.valueNames.reduce(function (map, name) { map[name] = dataSeries.getNativeValue(dataSeries.getYValuesByName(name), hitTestInfo.point2dataSeriesIndex); return map; }, {}); hitTestInfo.point2yValueByName = point2yValueByName; } return hitTestInfo; }; /** @inheritDoc */ LineSegmentSeriesHitTestProvider.prototype.hitTestForDataPointSelectionModifier = function (x, y, hitTestRadius) { if (hitTestRadius === void 0) { hitTestRadius = BaseHitTestProvider_1.BaseHitTestProvider.DEFAULT_HIT_TEST_RADIUS; } return this.hitTest(x, y, hitTestRadius); }; /** @inheritDoc */ LineSegmentSeriesHitTestProvider.prototype.hitTestXSlice = function (x, y) { return this.hitTest(x, y); }; /** @inheritDoc */ LineSegmentSeriesHitTestProvider.prototype.hitTestDataPoint = function (x, y, hitTestRadius) { return this.hitTest(x, y); }; return LineSegmentSeriesHitTestProvider; }(BaseHitTestProvider_1.BaseHitTestProvider)); exports.LineSegmentSeriesHitTestProvider = LineSegmentSeriesHitTestProvider;