polar.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
  2. var Base = require('./base');
  3. var Vector2 = require('../graphic/util/vector2');
  4. var Matrix = require('../graphic/util/matrix');
  5. var Polar =
  6. /*#__PURE__*/
  7. function (_Base) {
  8. _inheritsLoose(Polar, _Base);
  9. function Polar() {
  10. return _Base.apply(this, arguments) || this;
  11. }
  12. var _proto = Polar.prototype;
  13. _proto._initDefaultCfg = function _initDefaultCfg() {
  14. this.type = 'polar';
  15. this.startAngle = -Math.PI / 2;
  16. this.endAngle = Math.PI * 3 / 2;
  17. this.inner = 0;
  18. this.innerRadius = 0; // alias
  19. this.isPolar = true;
  20. this.transposed = false;
  21. this.center = null;
  22. this.radius = null; // relative, 0 ~ 1
  23. };
  24. _proto.init = function init(start, end) {
  25. var self = this;
  26. var inner = self.inner || self.innerRadius;
  27. var width = Math.abs(end.x - start.x);
  28. var height = Math.abs(end.y - start.y);
  29. var maxRadius;
  30. var center;
  31. if (self.startAngle === -Math.PI && self.endAngle === 0) {
  32. maxRadius = Math.min(width / 2, height);
  33. center = {
  34. x: (start.x + end.x) / 2,
  35. y: start.y
  36. };
  37. } else {
  38. maxRadius = Math.min(width, height) / 2;
  39. center = {
  40. x: (start.x + end.x) / 2,
  41. y: (start.y + end.y) / 2
  42. };
  43. }
  44. var radius = self.radius;
  45. if (radius > 0 && radius <= 1) {
  46. maxRadius = maxRadius * radius;
  47. }
  48. this.x = {
  49. start: self.startAngle,
  50. end: self.endAngle
  51. };
  52. this.y = {
  53. start: maxRadius * inner,
  54. end: maxRadius
  55. };
  56. this.center = center;
  57. this.circleRadius = maxRadius; // the radius value in px
  58. };
  59. _proto.convertPoint = function convertPoint(point) {
  60. var self = this;
  61. var center = self.center;
  62. var transposed = self.transposed;
  63. var xDim = transposed ? 'y' : 'x';
  64. var yDim = transposed ? 'x' : 'y';
  65. var x = self.x;
  66. var y = self.y;
  67. var angle = x.start + (x.end - x.start) * point[xDim];
  68. var radius = y.start + (y.end - y.start) * point[yDim];
  69. return {
  70. x: center.x + Math.cos(angle) * radius,
  71. y: center.y + Math.sin(angle) * radius
  72. };
  73. };
  74. _proto.invertPoint = function invertPoint(point) {
  75. var self = this;
  76. var center = self.center,
  77. transposed = self.transposed,
  78. x = self.x,
  79. y = self.y;
  80. var xDim = transposed ? 'y' : 'x';
  81. var yDim = transposed ? 'x' : 'y';
  82. var m = [1, 0, 0, 1, 0, 0];
  83. Matrix.rotate(m, m, x.start);
  84. var startV = [1, 0];
  85. Vector2.transformMat2d(startV, startV, m);
  86. startV = [startV[0], startV[1]];
  87. var pointV = [point.x - center.x, point.y - center.y];
  88. if (Vector2.zero(pointV)) {
  89. return {
  90. x: 0,
  91. y: 0
  92. };
  93. }
  94. var theta = Vector2.angleTo(startV, pointV, x.end < x.start);
  95. if (Math.abs(theta - Math.PI * 2) < 0.001) {
  96. theta = 0;
  97. }
  98. var l = Vector2.length(pointV);
  99. var percentX = theta / (x.end - x.start);
  100. percentX = x.end - x.start > 0 ? percentX : -percentX;
  101. var percentY = (l - y.start) / (y.end - y.start);
  102. var rst = {};
  103. rst[xDim] = percentX;
  104. rst[yDim] = percentY;
  105. return rst;
  106. };
  107. return Polar;
  108. }(Base);
  109. Base.Polar = Polar;
  110. module.exports = Polar;