lineAnimationDiff.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // var arrayDiff = require('zrender/src/core/arrayDiff');
  2. // 'zrender/src/core/arrayDiff' has been used before, but it did
  3. // not do well in performance when roam with fixed dataZoom window.
  4. function sign(val) {
  5. return val >= 0 ? 1 : -1;
  6. }
  7. function getStackedOnPoint(coordSys, data, idx) {
  8. var baseAxis = coordSys.getBaseAxis();
  9. var valueAxis = coordSys.getOtherAxis(baseAxis);
  10. var valueStart = baseAxis.onZero ? 0 : valueAxis.scale.getExtent()[0];
  11. var valueDim = valueAxis.dim;
  12. var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0;
  13. var stackedOnSameSign;
  14. var stackedOn = data.stackedOn;
  15. var val = data.get(valueDim, idx); // Find first stacked value with same sign
  16. while (stackedOn && sign(stackedOn.get(valueDim, idx)) === sign(val)) {
  17. stackedOnSameSign = stackedOn;
  18. break;
  19. }
  20. var stackedData = [];
  21. stackedData[baseDataOffset] = data.get(baseAxis.dim, idx);
  22. stackedData[1 - baseDataOffset] = stackedOnSameSign ? stackedOnSameSign.get(valueDim, idx, true) : valueStart;
  23. return coordSys.dataToPoint(stackedData);
  24. } // function convertToIntId(newIdList, oldIdList) {
  25. // // Generate int id instead of string id.
  26. // // Compare string maybe slow in score function of arrDiff
  27. // // Assume id in idList are all unique
  28. // var idIndicesMap = {};
  29. // var idx = 0;
  30. // for (var i = 0; i < newIdList.length; i++) {
  31. // idIndicesMap[newIdList[i]] = idx;
  32. // newIdList[i] = idx++;
  33. // }
  34. // for (var i = 0; i < oldIdList.length; i++) {
  35. // var oldId = oldIdList[i];
  36. // // Same with newIdList
  37. // if (idIndicesMap[oldId]) {
  38. // oldIdList[i] = idIndicesMap[oldId];
  39. // }
  40. // else {
  41. // oldIdList[i] = idx++;
  42. // }
  43. // }
  44. // }
  45. function diffData(oldData, newData) {
  46. var diffResult = [];
  47. newData.diff(oldData).add(function (idx) {
  48. diffResult.push({
  49. cmd: '+',
  50. idx: idx
  51. });
  52. }).update(function (newIdx, oldIdx) {
  53. diffResult.push({
  54. cmd: '=',
  55. idx: oldIdx,
  56. idx1: newIdx
  57. });
  58. }).remove(function (idx) {
  59. diffResult.push({
  60. cmd: '-',
  61. idx: idx
  62. });
  63. }).execute();
  64. return diffResult;
  65. }
  66. function _default(oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys) {
  67. var diff = diffData(oldData, newData); // var newIdList = newData.mapArray(newData.getId);
  68. // var oldIdList = oldData.mapArray(oldData.getId);
  69. // convertToIntId(newIdList, oldIdList);
  70. // // FIXME One data ?
  71. // diff = arrayDiff(oldIdList, newIdList);
  72. var currPoints = [];
  73. var nextPoints = []; // Points for stacking base line
  74. var currStackedPoints = [];
  75. var nextStackedPoints = [];
  76. var status = [];
  77. var sortedIndices = [];
  78. var rawIndices = [];
  79. var dims = newCoordSys.dimensions;
  80. for (var i = 0; i < diff.length; i++) {
  81. var diffItem = diff[i];
  82. var pointAdded = true; // FIXME, animation is not so perfect when dataZoom window moves fast
  83. // Which is in case remvoing or add more than one data in the tail or head
  84. switch (diffItem.cmd) {
  85. case '=':
  86. var currentPt = oldData.getItemLayout(diffItem.idx);
  87. var nextPt = newData.getItemLayout(diffItem.idx1); // If previous data is NaN, use next point directly
  88. if (isNaN(currentPt[0]) || isNaN(currentPt[1])) {
  89. currentPt = nextPt.slice();
  90. }
  91. currPoints.push(currentPt);
  92. nextPoints.push(nextPt);
  93. currStackedPoints.push(oldStackedOnPoints[diffItem.idx]);
  94. nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]);
  95. rawIndices.push(newData.getRawIndex(diffItem.idx1));
  96. break;
  97. case '+':
  98. var idx = diffItem.idx;
  99. currPoints.push(oldCoordSys.dataToPoint([newData.get(dims[0], idx, true), newData.get(dims[1], idx, true)]));
  100. nextPoints.push(newData.getItemLayout(idx).slice());
  101. currStackedPoints.push(getStackedOnPoint(oldCoordSys, newData, idx));
  102. nextStackedPoints.push(newStackedOnPoints[idx]);
  103. rawIndices.push(newData.getRawIndex(idx));
  104. break;
  105. case '-':
  106. var idx = diffItem.idx;
  107. var rawIndex = oldData.getRawIndex(idx); // Data is replaced. In the case of dynamic data queue
  108. // FIXME FIXME FIXME
  109. if (rawIndex !== idx) {
  110. currPoints.push(oldData.getItemLayout(idx));
  111. nextPoints.push(newCoordSys.dataToPoint([oldData.get(dims[0], idx, true), oldData.get(dims[1], idx, true)]));
  112. currStackedPoints.push(oldStackedOnPoints[idx]);
  113. nextStackedPoints.push(getStackedOnPoint(newCoordSys, oldData, idx));
  114. rawIndices.push(rawIndex);
  115. } else {
  116. pointAdded = false;
  117. }
  118. } // Original indices
  119. if (pointAdded) {
  120. status.push(diffItem);
  121. sortedIndices.push(sortedIndices.length);
  122. }
  123. } // Diff result may be crossed if all items are changed
  124. // Sort by data index
  125. sortedIndices.sort(function (a, b) {
  126. return rawIndices[a] - rawIndices[b];
  127. });
  128. var sortedCurrPoints = [];
  129. var sortedNextPoints = [];
  130. var sortedCurrStackedPoints = [];
  131. var sortedNextStackedPoints = [];
  132. var sortedStatus = [];
  133. for (var i = 0; i < sortedIndices.length; i++) {
  134. var idx = sortedIndices[i];
  135. sortedCurrPoints[i] = currPoints[idx];
  136. sortedNextPoints[i] = nextPoints[idx];
  137. sortedCurrStackedPoints[i] = currStackedPoints[idx];
  138. sortedNextStackedPoints[i] = nextStackedPoints[idx];
  139. sortedStatus[i] = status[idx];
  140. }
  141. return {
  142. current: sortedCurrPoints,
  143. next: sortedNextPoints,
  144. stackedOnCurrent: sortedCurrStackedPoints,
  145. stackedOnNext: sortedNextStackedPoints,
  146. status: sortedStatus
  147. };
  148. }
  149. module.exports = _default;