UNPKG

mxgraph

Version:

mxGraph is a fully client side JavaScript diagramming library that uses SVG and HTML for rendering.

118 lines (107 loc) 3.39 kB
/** * Copyright (c) 2006-2015, JGraph Ltd * Copyright (c) 2006-2015, Gaudenz Alder */ /** * Class: mxArrow * * Extends <mxShape> to implement an arrow shape. (The shape * is used to represent edges, not vertices.) * This shape is registered under <mxConstants.SHAPE_ARROW> * in <mxCellRenderer>. * * Constructor: mxArrow * * Constructs a new arrow shape. * * Parameters: * * points - Array of <mxPoints> that define the points. This is stored in * <mxShape.points>. * fill - String that defines the fill color. This is stored in <fill>. * stroke - String that defines the stroke color. This is stored in <stroke>. * strokewidth - Optional integer that defines the stroke width. Default is * 1. This is stored in <strokewidth>. * arrowWidth - Optional integer that defines the arrow width. Default is * <mxConstants.ARROW_WIDTH>. This is stored in <arrowWidth>. * spacing - Optional integer that defines the spacing between the arrow shape * and its endpoints. Default is <mxConstants.ARROW_SPACING>. This is stored in * <spacing>. * endSize - Optional integer that defines the size of the arrowhead. Default * is <mxConstants.ARROW_SIZE>. This is stored in <endSize>. */ function mxArrow(points, fill, stroke, strokewidth, arrowWidth, spacing, endSize) { mxShape.call(this); this.points = points; this.fill = fill; this.stroke = stroke; this.strokewidth = (strokewidth != null) ? strokewidth : 1; this.arrowWidth = (arrowWidth != null) ? arrowWidth : mxConstants.ARROW_WIDTH; this.spacing = (spacing != null) ? spacing : mxConstants.ARROW_SPACING; this.endSize = (endSize != null) ? endSize : mxConstants.ARROW_SIZE; }; /** * Extends mxShape. */ mxUtils.extend(mxArrow, mxShape); /** * Function: augmentBoundingBox * * Augments the bounding box with the edge width and markers. */ mxArrow.prototype.augmentBoundingBox = function(bbox) { mxShape.prototype.augmentBoundingBox.apply(this, arguments); var w = Math.max(this.arrowWidth, this.endSize); bbox.grow((w / 2 + this.strokewidth) * this.scale); }; /** * Function: paintEdgeShape * * Paints the line shape. */ mxArrow.prototype.paintEdgeShape = function(c, pts) { // Geometry of arrow var spacing = mxConstants.ARROW_SPACING; var width = mxConstants.ARROW_WIDTH; var arrow = mxConstants.ARROW_SIZE; // Base vector (between end points) var p0 = pts[0]; var pe = pts[pts.length - 1]; var dx = pe.x - p0.x; var dy = pe.y - p0.y; var dist = Math.sqrt(dx * dx + dy * dy); var length = dist - 2 * spacing - arrow; // Computes the norm and the inverse norm var nx = dx / dist; var ny = dy / dist; var basex = length * nx; var basey = length * ny; var floorx = width * ny/3; var floory = -width * nx/3; // Computes points var p0x = p0.x - floorx / 2 + spacing * nx; var p0y = p0.y - floory / 2 + spacing * ny; var p1x = p0x + floorx; var p1y = p0y + floory; var p2x = p1x + basex; var p2y = p1y + basey; var p3x = p2x + floorx; var p3y = p2y + floory; // p4 not necessary var p5x = p3x - 3 * floorx; var p5y = p3y - 3 * floory; c.begin(); c.moveTo(p0x, p0y); c.lineTo(p1x, p1y); c.lineTo(p2x, p2y); c.lineTo(p3x, p3y); c.lineTo(pe.x - spacing * nx, pe.y - spacing * ny); c.lineTo(p5x, p5y); c.lineTo(p5x + floorx, p5y + floory); c.close(); c.fillAndStroke(); }; __mxOutput.mxArrow = typeof mxArrow !== 'undefined' ? mxArrow : undefined;