polar.js 2.8 KB

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