function drawhead(arrowHeadStyle, p, rot, arrowScale) {
        if(!arrowHeadStyle.path) return;
        if(arrowHeadStyle.noRotate) rot = 0;

        d3.select(el.parentNode).append('path')
            .attr({
                class: el3.attr('class'),
                d: arrowHeadStyle.path,
                transform:
                    strTranslate(p.x, p.y) +
                    strRotate(rot * 180 / Math.PI) +
                    strScale(arrowScale)
            })
            .style({
                fill: Color.rgb(options.arrowcolor),
                'stroke-width': 0
            });
    }
Add arrowhead(s) to a path or line element

@param {d3.selection} el3: a d3-selected line or path element

@param {string} ends: 'none', 'start', 'end', or 'start+end' for which ends get arrowheads

@param {object} options: style information. Must have all the following:
@param {number} options.arrowhead: end head style - see ./arrow_paths
@param {number} options.startarrowhead: start head style - see ./arrow_paths
@param {number} options.arrowsize: relative size of the end head vs line width
@param {number} options.startarrowsize: relative size of the start head vs line width
@param {number} options.standoff: distance in px to move the end arrow point from its target
@param {number} options.startstandoff: distance in px to move the start arrow point from its target
@param {number} options.arrowwidth: width of the arrow line
@param {string} options.arrowcolor: color of the arrow line, for the head to match
    Note that the opacity of this color is ignored, as it's assumed the container
    of both the line and head has opacity applied to it so there isn't greater opacity
    where they overlap.