UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

227 lines (226 loc) • 9.79 kB
/** * DevExtreme (esm/viz/series/points/polar_point.js) * Version: 21.1.4 * Build date: Mon Jun 21 2021 * * Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import { extend } from "../../../core/utils/extend"; var _extend = extend; import symbolPoint from "./symbol_point"; import barPoint from "./bar_point"; import piePoint from "./pie_point"; import { isDefined } from "../../../core/utils/type"; import { normalizeAngle, convertPolarToXY, getCosAndSin, convertXYToPolar } from "../../core/utils"; var _math = Math; var _max = _math.max; import consts from "../../components/consts"; var RADIAL_LABEL_INDENT = consts.radialLabelIndent; var ERROR_BARS_ANGLE_OFFSET = 90; var CANVAS_POSITION_START = "canvas_position_start"; var CANVAS_POSITION_END = "canvas_position_end"; var CANVAS_POSITION_DEFAULT = "canvas_position_default"; export var polarSymbolPoint = _extend({}, symbolPoint, { _getLabelCoords: piePoint._getLabelCoords, _getElementCoords: piePoint._getElementCoords, _moveLabelOnCanvas: function(coord, visibleArea, labelBBox) { var x = coord.x; var y = coord.y; if (visibleArea.minX > x) { x = visibleArea.minX } if (visibleArea.maxX < x + labelBBox.width) { x = visibleArea.maxX - labelBBox.width } if (visibleArea.minY > y) { y = visibleArea.minY } if (visibleArea.maxY < y + labelBBox.height) { y = visibleArea.maxY - labelBBox.height } return { x: x, y: y } }, _getLabelPosition: function() { return "outside" }, _getCoords: function(argument, value) { var axis = this.series.getValueAxis(); var startAngle = axis.getAngles()[0]; var angle = this._getArgTranslator().translate(argument); var radius = this._getValTranslator().translate(value); var coords = convertPolarToXY(axis.getCenter(), axis.getAngles()[0], angle, radius); coords.angle = angle + startAngle - 90, coords.radius = radius; return coords }, _translate() { var center = this.series.getValueAxis().getCenter(); var coord = this._getCoords(this.argument, this.value); var translator = this._getValTranslator(); var maxRadius = translator.isInverted() ? translator.translate(CANVAS_POSITION_START) : translator.translate(CANVAS_POSITION_END); var normalizedRadius = isDefined(coord.radius) && coord.radius >= 0 ? coord.radius : null; this.vx = normalizeAngle(coord.angle); this.vy = this.radiusOuter = this.radiusLabels = normalizedRadius; this.radiusLabels += RADIAL_LABEL_INDENT; this.radius = normalizedRadius; this.middleAngle = -coord.angle; this.angle = -coord.angle; this.x = coord.x; this.y = coord.y; this.defaultX = this.centerX = center.x; this.defaultY = this.centerY = center.y; this._translateErrorBars(); this.inVisibleArea = this._checkRadiusForVisibleArea(normalizedRadius, maxRadius) }, _checkRadiusForVisibleArea: (radius, maxRadius) => isDefined(radius) && radius <= maxRadius, _translateErrorBars: function() { var errorBars = this._options.errorBars; var translator = this._getValTranslator(); if (!errorBars) { return } isDefined(this.lowError) && (this._lowErrorCoord = this.centerY - translator.translate(this.lowError)); isDefined(this.highError) && (this._highErrorCoord = this.centerY - translator.translate(this.highError)); this._errorBarPos = this.centerX; this._baseErrorBarPos = "stdDeviation" === errorBars.type ? this._lowErrorCoord + (this._highErrorCoord - this._lowErrorCoord) / 2 : this.centerY - this.radius }, _getTranslates: function(animationEnabled) { return animationEnabled ? this.getDefaultCoords() : { x: this.x, y: this.y } }, getDefaultCoords: function() { var cosSin = getCosAndSin(-this.angle); var radius = this._getValTranslator().translate(CANVAS_POSITION_DEFAULT); var x = this.defaultX + radius * cosSin.cos; var y = this.defaultY + radius * cosSin.sin; return { x: x, y: y } }, _addLabelAlignmentAndOffset: function(label, coord) { return coord }, _checkLabelPosition: function(label, coord) { var visibleArea = this._getVisibleArea(); var graphicBBox = this._getGraphicBBox(); if (this._isPointInVisibleArea(visibleArea, graphicBBox)) { coord = this._moveLabelOnCanvas(coord, visibleArea, label.getBoundingRect()) } return coord }, _getErrorBarSettings: function(errorBarOptions, animationEnabled) { var settings = symbolPoint._getErrorBarSettings.call(this, errorBarOptions, animationEnabled); settings.rotate = ERROR_BARS_ANGLE_OFFSET - this.angle; settings.rotateX = this.centerX; settings.rotateY = this.centerY; return settings }, getCoords: function(min) { return min ? this.getDefaultCoords() : { x: this.x, y: this.y } } }); export var polarBarPoint = _extend({}, barPoint, { _translateErrorBars: polarSymbolPoint._translateErrorBars, _getErrorBarSettings: polarSymbolPoint._getErrorBarSettings, _moveLabelOnCanvas: polarSymbolPoint._moveLabelOnCanvas, _getLabelCoords: piePoint._getLabelCoords, _getElementCoords: piePoint._getElementCoords, _getLabelConnector: piePoint._getLabelConnector, getTooltipParams: piePoint.getTooltipParams, _getLabelPosition: piePoint._getLabelPosition, _getCoords: polarSymbolPoint._getCoords, _translate() { var translator = this._getValTranslator(); var businessRange = translator.getBusinessRange(); var maxRadius = translator.isInverted() ? translator.translate(CANVAS_POSITION_START) : translator.translate(CANVAS_POSITION_END); this.radiusInner = translator.translate(this.minValue); polarSymbolPoint._translate.call(this); if (null === this.radiusInner) { this.radiusInner = this.radius = maxRadius } else if (null === this.radius) { this.radius = this.value >= businessRange.minVisible ? maxRadius : 0 } else if (this.radius > maxRadius) { this.radius = maxRadius } this.radiusOuter = this.radiusLabels = _max(this.radiusInner, this.radius); this.radiusLabels += RADIAL_LABEL_INDENT; this.radiusInner = this.defaultRadius = _math.min(this.radiusInner, this.radius); this.middleAngle = this.angle = -normalizeAngle(this.middleAngleCorrection - this.angle) }, _checkRadiusForVisibleArea(radius) { return isDefined(radius) || this._getValTranslator().translate(this.minValue) > 0 }, _getErrorBarBaseEdgeLength() { var coord = this.getMarkerCoords(); return _math.PI * coord.outerRadius * _math.abs(coord.startAngle - coord.endAngle) / 180 }, getMarkerCoords: function() { return { x: this.centerX, y: this.centerY, outerRadius: this.radiusOuter, innerRadius: this.defaultRadius, startAngle: this.middleAngle - this.interval / 2, endAngle: this.middleAngle + this.interval / 2 } }, _drawMarker: function(renderer, group, animationEnabled) { var styles = this._getStyle(); var coords = this.getMarkerCoords(); var innerRadius = coords.innerRadius; var outerRadius = coords.outerRadius; var start = this._getCoords(this.argument, CANVAS_POSITION_DEFAULT); var x = coords.x; var y = coords.y; if (animationEnabled) { innerRadius = 0; outerRadius = 0; x = start.x; y = start.y } this.graphic = renderer.arc(x, y, innerRadius, outerRadius, coords.startAngle, coords.endAngle).attr(styles).data({ "chart-data-point": this }).append(group) }, _checkLabelPosition: function(label, coord) { var visibleArea = this._getVisibleArea(); var angleFunctions = getCosAndSin(this.middleAngle); var x = this.centerX + this.defaultRadius * angleFunctions.cos; var y = this.centerY - this.defaultRadius * angleFunctions.sin; if (x > visibleArea.minX && x < visibleArea.maxX && y > visibleArea.minY && y < visibleArea.maxY) { coord = this._moveLabelOnCanvas(coord, visibleArea, label.getBoundingRect()) } return coord }, _addLabelAlignmentAndOffset: function(label, coord) { return coord }, correctCoordinates: function(correctOptions) { this.middleAngleCorrection = correctOptions.offset; this.interval = correctOptions.width }, coordsIn: function(x, y) { var val = convertXYToPolar(this.series.getValueAxis().getCenter(), x, y); var coords = this.getMarkerCoords(); var isBetweenAngles = coords.startAngle < coords.endAngle ? -val.phi >= coords.startAngle && -val.phi <= coords.endAngle : -val.phi <= coords.startAngle && -val.phi >= coords.endAngle; return val.r >= coords.innerRadius && val.r <= coords.outerRadius && isBetweenAngles } });