area_series.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /**
  2. * DevExtreme (viz/series/area_series.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var objectUtils = require("../../core/utils/object");
  11. var extend = require("../../core/utils/extend").extend;
  12. var scatterSeries = require("./scatter_series").chart;
  13. var lineSeries = require("./line_series");
  14. var chartLineSeries = lineSeries.chart.line;
  15. var polarLineSeries = lineSeries.polar.line;
  16. var _map = require("../core/utils").map;
  17. var _extend = extend;
  18. var calculateBezierPoints = lineSeries.chart.spline._calculateBezierPoints;
  19. exports.chart = {};
  20. exports.polar = {};
  21. var baseAreaMethods = {
  22. _createBorderElement: chartLineSeries._createMainElement,
  23. _createLegendState: function(styleOptions, defaultColor) {
  24. return {
  25. fill: styleOptions.color || defaultColor,
  26. opacity: styleOptions.opacity,
  27. hatching: styleOptions.hatching
  28. }
  29. },
  30. getValueRangeInitialValue: function() {
  31. if ("logarithmic" !== this.valueAxisType && "datetime" !== this.valueType && false !== this.showZero) {
  32. return 0
  33. } else {
  34. return scatterSeries.getValueRangeInitialValue.call(this)
  35. }
  36. },
  37. _getDefaultSegment: function(segment) {
  38. var defaultSegment = chartLineSeries._getDefaultSegment(segment);
  39. defaultSegment.area = defaultSegment.line.concat(defaultSegment.line.slice().reverse());
  40. return defaultSegment
  41. },
  42. _updateElement: function(element, segment, animate, complete) {
  43. var lineParams = {
  44. points: segment.line
  45. };
  46. var areaParams = {
  47. points: segment.area
  48. };
  49. var borderElement = element.line;
  50. if (animate) {
  51. borderElement && borderElement.animate(lineParams);
  52. element.area.animate(areaParams, {}, complete)
  53. } else {
  54. borderElement && borderElement.attr(lineParams);
  55. element.area.attr(areaParams)
  56. }
  57. },
  58. _removeElement: function(element) {
  59. element.line && element.line.remove();
  60. element.area.remove()
  61. },
  62. _drawElement: function(segment) {
  63. return {
  64. line: this._bordersGroup && this._createBorderElement(segment.line, {
  65. "stroke-width": this._styles.normal.border["stroke-width"]
  66. }).append(this._bordersGroup),
  67. area: this._createMainElement(segment.area).append(this._elementsGroup)
  68. }
  69. },
  70. _applyStyle: function(style) {
  71. var that = this;
  72. that._elementsGroup && that._elementsGroup.smartAttr(style.elements);
  73. that._bordersGroup && that._bordersGroup.attr(style.border);
  74. (that._graphics || []).forEach(function(graphic) {
  75. graphic.line && graphic.line.attr({
  76. "stroke-width": style.border["stroke-width"]
  77. }).sharp()
  78. })
  79. },
  80. _parseStyle: function(options, defaultColor, defaultBorderColor) {
  81. var borderOptions = options.border || {};
  82. var borderStyle = chartLineSeries._parseLineOptions(borderOptions, defaultBorderColor);
  83. borderStyle.stroke = borderOptions.visible && borderStyle["stroke-width"] ? borderStyle.stroke : "none";
  84. borderStyle["stroke-width"] = borderStyle["stroke-width"] || 1;
  85. return {
  86. border: borderStyle,
  87. elements: {
  88. stroke: "none",
  89. fill: options.color || defaultColor,
  90. hatching: options.hatching,
  91. opacity: options.opacity
  92. }
  93. }
  94. },
  95. _areBordersVisible: function() {
  96. var options = this._options;
  97. return options.border.visible || options.hoverStyle.border.visible || options.selectionStyle.border.visible
  98. },
  99. _createMainElement: function(points, settings) {
  100. return this._renderer.path(points, "area").attr(settings)
  101. },
  102. _getTrackerSettings: function(segment) {
  103. return {
  104. "stroke-width": segment.singlePointSegment ? this._defaultTrackerWidth : 0
  105. }
  106. },
  107. _getMainPointsFromSegment: function(segment) {
  108. return segment.area
  109. }
  110. };
  111. function createAreaPoints(points) {
  112. return _map(points, function(pt) {
  113. return pt.getCoords()
  114. }).concat(_map(points.slice().reverse(), function(pt) {
  115. return pt.getCoords(true)
  116. }))
  117. }
  118. var areaSeries = exports.chart.area = _extend({}, chartLineSeries, baseAreaMethods, {
  119. _prepareSegment: function(points, rotated) {
  120. var that = this;
  121. var processedPoints = that._processSinglePointsAreaSegment(points, rotated);
  122. var areaPoints = createAreaPoints(processedPoints);
  123. var argAxis = that.getArgumentAxis();
  124. if (argAxis.getAxisPosition) {
  125. var argAxisPosition = argAxis.getAxisPosition();
  126. var axisOptions = argAxis.getOptions();
  127. var edgeOffset = (!rotated ? -1 : 1) * Math.round(axisOptions.width / 2);
  128. if (axisOptions.visible) {
  129. areaPoints.forEach(function(p, i) {
  130. if (p) {
  131. var index = 1 === points.length ? 0 : i < points.length ? i : areaPoints.length - 1 - i;
  132. rotated && p.x === points[index].defaultX && p.x === argAxisPosition - argAxis.getAxisShift() && (p.x += edgeOffset);
  133. !rotated && p.y === points[index].defaultY && p.y === argAxisPosition - argAxis.getAxisShift() && (p.y += edgeOffset)
  134. }
  135. })
  136. }
  137. }
  138. return {
  139. line: processedPoints,
  140. area: areaPoints,
  141. singlePointSegment: processedPoints !== points
  142. }
  143. },
  144. _processSinglePointsAreaSegment: function(points, rotated) {
  145. if (points && 1 === points.length) {
  146. var p = points[0];
  147. var p1 = objectUtils.clone(p);
  148. p1[rotated ? "y" : "x"] += 1;
  149. p1.argument = null;
  150. return [p, p1]
  151. }
  152. return points
  153. }
  154. });
  155. exports.polar.area = _extend({}, polarLineSeries, baseAreaMethods, {
  156. _prepareSegment: function(points, rotated, lastSegment) {
  157. lastSegment && polarLineSeries._closeSegment.call(this, points);
  158. return areaSeries._prepareSegment.call(this, points)
  159. },
  160. _processSinglePointsAreaSegment: function(points) {
  161. return lineSeries.polar.line._prepareSegment.call(this, points).line
  162. }
  163. });
  164. exports.chart.steparea = _extend({}, areaSeries, {
  165. _prepareSegment: function(points, rotated) {
  166. var stepLineSeries = lineSeries.chart.stepline;
  167. points = areaSeries._processSinglePointsAreaSegment(points, rotated);
  168. return areaSeries._prepareSegment.call(this, stepLineSeries._calculateStepLinePoints.call(this, points), rotated)
  169. },
  170. getSeriesPairCoord: lineSeries.chart.stepline.getSeriesPairCoord
  171. });
  172. exports.chart.splinearea = _extend({}, areaSeries, {
  173. _areaPointsToSplineAreaPoints: function(areaPoints) {
  174. var previousMiddlePoint = areaPoints[areaPoints.length / 2 - 1];
  175. var middlePoint = areaPoints[areaPoints.length / 2];
  176. areaPoints.splice(areaPoints.length / 2, 0, {
  177. x: previousMiddlePoint.x,
  178. y: previousMiddlePoint.y
  179. }, {
  180. x: middlePoint.x,
  181. y: middlePoint.y
  182. })
  183. },
  184. _prepareSegment: function(points, rotated) {
  185. var processedPoints = areaSeries._processSinglePointsAreaSegment(points, rotated);
  186. var areaSegment = areaSeries._prepareSegment.call(this, calculateBezierPoints(processedPoints, rotated));
  187. this._areaPointsToSplineAreaPoints(areaSegment.area);
  188. areaSegment.singlePointSegment = processedPoints !== points;
  189. return areaSegment
  190. },
  191. _getDefaultSegment: function(segment) {
  192. var areaDefaultSegment = areaSeries._getDefaultSegment(segment);
  193. this._areaPointsToSplineAreaPoints(areaDefaultSegment.area);
  194. return areaDefaultSegment
  195. },
  196. _createMainElement: function(points, settings) {
  197. return this._renderer.path(points, "bezierarea").attr(settings)
  198. },
  199. _createBorderElement: lineSeries.chart.spline._createMainElement,
  200. getSeriesPairCoord: lineSeries.chart.spline.getSeriesPairCoord,
  201. getNearestPointsByCoord: lineSeries.chart.spline.getNearestPointsByCoord,
  202. obtainCubicBezierTCoef: lineSeries.chart.spline.obtainCubicBezierTCoef
  203. });