4e2af192e69503dec08cc8e73885bc2e00bbfcceaa68cb777bf424dd402831725e78bc1f43c37983a3f9bb950d1a1ced6a4befb863e56be1248f3e18693553 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. 'use strict';
  2. function orient(point, origin) {
  3. var x0 = origin.x;
  4. var y0 = origin.y;
  5. if (x0 === null) {
  6. return {x: 0, y: -1};
  7. }
  8. if (y0 === null) {
  9. return {x: 1, y: 0};
  10. }
  11. var dx = point.x - x0;
  12. var dy = point.y - y0;
  13. var ln = Math.sqrt(dx * dx + dy * dy);
  14. return {
  15. x: ln ? dx / ln : 0,
  16. y: ln ? dy / ln : -1
  17. };
  18. }
  19. function aligned(x, y, vx, vy, align) {
  20. switch (align) {
  21. case 'center':
  22. vx = vy = 0;
  23. break;
  24. case 'bottom':
  25. vx = 0;
  26. vy = 1;
  27. break;
  28. case 'right':
  29. vx = 1;
  30. vy = 0;
  31. break;
  32. case 'left':
  33. vx = -1;
  34. vy = 0;
  35. break;
  36. case 'top':
  37. vx = 0;
  38. vy = -1;
  39. break;
  40. case 'start':
  41. vx = -vx;
  42. vy = -vy;
  43. break;
  44. case 'end':
  45. // keep the natural orientation
  46. break;
  47. default:
  48. // clockwise rotation (in degree)
  49. align *= (Math.PI / 180);
  50. vx = Math.cos(align);
  51. vy = Math.sin(align);
  52. break;
  53. }
  54. return {
  55. x: x,
  56. y: y,
  57. vx: vx,
  58. vy: vy
  59. };
  60. }
  61. export default {
  62. arc: function(vm, anchor, align) {
  63. var angle = (vm.startAngle + vm.endAngle) / 2;
  64. var vx = Math.cos(angle);
  65. var vy = Math.sin(angle);
  66. var r0 = vm.innerRadius;
  67. var r1 = vm.outerRadius;
  68. var d;
  69. if (anchor === 'start') {
  70. d = r0;
  71. } else if (anchor === 'end') {
  72. d = r1;
  73. } else {
  74. d = (r0 + r1) / 2;
  75. }
  76. return aligned(
  77. vm.x + vx * d,
  78. vm.y + vy * d,
  79. vx,
  80. vy,
  81. align);
  82. },
  83. point: function(vm, anchor, align, origin) {
  84. var v = orient(vm, origin);
  85. var r = vm.radius;
  86. var d = 0;
  87. if (anchor === 'start') {
  88. d = -r;
  89. } else if (anchor === 'end') {
  90. d = r;
  91. }
  92. return aligned(
  93. vm.x + v.x * d,
  94. vm.y + v.y * d,
  95. v.x,
  96. v.y,
  97. align);
  98. },
  99. rect: function(vm, anchor, align, origin) {
  100. var horizontal = vm.horizontal;
  101. var size = Math.abs(vm.base - (horizontal ? vm.x : vm.y));
  102. var x = horizontal ? Math.min(vm.x, vm.base) : vm.x;
  103. var y = horizontal ? vm.y : Math.min(vm.y, vm.base);
  104. var v = orient(vm, origin);
  105. if (anchor === 'center') {
  106. if (horizontal) {
  107. x += size / 2;
  108. } else {
  109. y += size / 2;
  110. }
  111. } else if (anchor === 'start' && !horizontal) {
  112. y += size;
  113. } else if (anchor === 'end' && horizontal) {
  114. x += size;
  115. }
  116. return aligned(
  117. x,
  118. y,
  119. v.x,
  120. v.y,
  121. align);
  122. },
  123. fallback: function(vm, anchor, align, origin) {
  124. var v = orient(vm, origin);
  125. return aligned(
  126. vm.x,
  127. vm.y,
  128. v.x,
  129. v.y,
  130. align);
  131. }
  132. };