1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import { FunctionExt } from '@antv/x6-common';
- import { Point, Line, Angle } from '@antv/x6-geometry';
- import { resolve } from './manhattan/options';
- import { manhattan } from './manhattan/index';
- const defaults = {
- maxDirectionChange: 45,
- // an array of directions to find next points on the route
- // different from start/end directions
- directions() {
- const step = resolve(this.step, this);
- const cost = resolve(this.cost, this);
- const diagonalCost = Math.ceil(Math.sqrt((step * step) << 1)); // eslint-disable-line no-bitwise
- return [
- { cost, offsetX: step, offsetY: 0 },
- { cost: diagonalCost, offsetX: step, offsetY: step },
- { cost, offsetX: 0, offsetY: step },
- { cost: diagonalCost, offsetX: -step, offsetY: step },
- { cost, offsetX: -step, offsetY: 0 },
- { cost: diagonalCost, offsetX: -step, offsetY: -step },
- { cost, offsetX: 0, offsetY: -step },
- { cost: diagonalCost, offsetX: step, offsetY: -step },
- ];
- },
- // a simple route used in situations when main routing method fails
- // (exceed max number of loop iterations, inaccessible)
- fallbackRoute(from, to, options) {
- // Find a route which breaks by 45 degrees ignoring all obstacles.
- const theta = from.theta(to);
- const route = [];
- let a = { x: to.x, y: from.y };
- let b = { x: from.x, y: to.y };
- if (theta % 180 > 90) {
- const t = a;
- a = b;
- b = t;
- }
- const p1 = theta % 90 < 45 ? a : b;
- const l1 = new Line(from, p1);
- const alpha = 90 * Math.ceil(theta / 90);
- const p2 = Point.fromPolar(l1.squaredLength(), Angle.toRad(alpha + 135), p1);
- const l2 = new Line(to, p2);
- const intersectionPoint = l1.intersectsWithLine(l2);
- const point = intersectionPoint || to;
- const directionFrom = intersectionPoint ? point : from;
- const quadrant = 360 / options.directions.length;
- const angleTheta = directionFrom.theta(to);
- const normalizedAngle = Angle.normalize(angleTheta + quadrant / 2);
- const directionAngle = quadrant * Math.floor(normalizedAngle / quadrant);
- options.previousDirectionAngle = directionAngle;
- if (point)
- route.push(point.round());
- route.push(to);
- return route;
- },
- };
- export const metro = function (vertices, options, linkView) {
- return FunctionExt.call(manhattan, this, vertices, Object.assign(Object.assign({}, defaults), options), linkView);
- };
- //# sourceMappingURL=metro.js.map
|