| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- 'use strict';
- function orient(point, origin) {
- var x0 = origin.x;
- var y0 = origin.y;
- if (x0 === null) {
- return {x: 0, y: -1};
- }
- if (y0 === null) {
- return {x: 1, y: 0};
- }
- var dx = point.x - x0;
- var dy = point.y - y0;
- var ln = Math.sqrt(dx * dx + dy * dy);
- return {
- x: ln ? dx / ln : 0,
- y: ln ? dy / ln : -1
- };
- }
- function aligned(x, y, vx, vy, align) {
- switch (align) {
- case 'center':
- vx = vy = 0;
- break;
- case 'bottom':
- vx = 0;
- vy = 1;
- break;
- case 'right':
- vx = 1;
- vy = 0;
- break;
- case 'left':
- vx = -1;
- vy = 0;
- break;
- case 'top':
- vx = 0;
- vy = -1;
- break;
- case 'start':
- vx = -vx;
- vy = -vy;
- break;
- case 'end':
- // keep the natural orientation
- break;
- default:
- // clockwise rotation (in degree)
- align *= (Math.PI / 180);
- vx = Math.cos(align);
- vy = Math.sin(align);
- break;
- }
- return {
- x: x,
- y: y,
- vx: vx,
- vy: vy
- };
- }
- export default {
- arc: function(vm, anchor, align) {
- var angle = (vm.startAngle + vm.endAngle) / 2;
- var vx = Math.cos(angle);
- var vy = Math.sin(angle);
- var r0 = vm.innerRadius;
- var r1 = vm.outerRadius;
- var d;
- if (anchor === 'start') {
- d = r0;
- } else if (anchor === 'end') {
- d = r1;
- } else {
- d = (r0 + r1) / 2;
- }
- return aligned(
- vm.x + vx * d,
- vm.y + vy * d,
- vx,
- vy,
- align);
- },
- point: function(vm, anchor, align, origin) {
- var v = orient(vm, origin);
- var r = vm.radius;
- var d = 0;
- if (anchor === 'start') {
- d = -r;
- } else if (anchor === 'end') {
- d = r;
- }
- return aligned(
- vm.x + v.x * d,
- vm.y + v.y * d,
- v.x,
- v.y,
- align);
- },
- rect: function(vm, anchor, align, origin) {
- var horizontal = vm.horizontal;
- var size = Math.abs(vm.base - (horizontal ? vm.x : vm.y));
- var x = horizontal ? Math.min(vm.x, vm.base) : vm.x;
- var y = horizontal ? vm.y : Math.min(vm.y, vm.base);
- var v = orient(vm, origin);
- if (anchor === 'center') {
- if (horizontal) {
- x += size / 2;
- } else {
- y += size / 2;
- }
- } else if (anchor === 'start' && !horizontal) {
- y += size;
- } else if (anchor === 'end' && horizontal) {
- x += size;
- }
- return aligned(
- x,
- y,
- v.x,
- v.y,
- align);
- },
- fallback: function(vm, anchor, align, origin) {
- var v = orient(vm, origin);
- return aligned(
- vm.x,
- vm.y,
- v.x,
- v.y,
- align);
- }
- };
|