(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define('d3-glyphEdge', ['exports'], factory) : factory((global.d3_glyphEdge = {})); }(this, function (exports) { 'use strict'; function halfArrow(d, nodeTargetSize, bodySize, headSize) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var headDistance = headSize * 3; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 - ( Math.PI / 2 ); var angle2 = angle0 + ( Math.PI / 2 ); var x1 = d.source.x + (headSize * Math.cos(angle1)); var y1 = d.source.y - (headSize * Math.sin(angle1)); var x2 = d.source.x + (headSize * Math.cos(angle2)); var y2 = d.source.y - (headSize * Math.sin(angle2)); var x3 = d.target.x - (headSize * Math.cos(angle1)); var y3 = d.target.y + (headSize * Math.sin(angle1)); var mx1 = d.source.x + (bodySize * Math.cos(angle1)); var my1 = d.source.y - (bodySize * Math.sin(angle1)); var mx2 = d.source.x + (bodySize * Math.cos(angle2)); var my2 = d.source.y - (bodySize * Math.sin(angle2)); var mx3 = d.target.x + (bodySize * Math.cos(angle1)); var my3 = d.target.y - (bodySize * Math.sin(angle1)); var dY = d.source.y - d.target.y; var dX = d.source.x - d.target.x; var midDiffY1 = my1 - my3; var midDiffX1 = mx1 - mx3; var diffY1 = y1 - y3; var diffX1 = x1 - x3; var pythag = Math.sqrt((midDiffX1 * midDiffX1) + (midDiffY1 * midDiffY1)); var pythag2 = Math.sqrt((dX * dX) + (dY * dY)); var adjX1 = mx2 - ((midDiffX1 * (pythag - headDistance - nodeTargetSize)) / pythag); var adjY1 = my2 - ((midDiffY1 * (pythag - headDistance - nodeTargetSize)) / pythag); var headX1 = x2 - ((diffX1 * (pythag - headDistance - nodeTargetSize)) / pythag); var headY1 = y2 - ((diffY1 * (pythag - headDistance - nodeTargetSize)) / pythag); var tipX = d.source.x - ((dX * (pythag2 - nodeTargetSize)) / pythag2); var tipY = d.source.y - ((dY * (pythag2 - nodeTargetSize)) / pythag2); return "M" + d.source.x + "," + d.source.y + "L" + mx2 + "," + my2 + "L" + adjX1 + "," + adjY1 + "L" + headX1 + "," + headY1 + "L" + tipX + "," + tipY + "L" + d.source.x + "," + d.source.y + "z"; }; function lineArc(d) { var dx = d.target.x - d.source.x, dy = d.target.y - d.source.y, dr = Math.sqrt(dx * dx + dy * dy); return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y; }; function ribbon(d, bodySize) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 - ( Math.PI / 2 ); var angle2 = angle0 + ( Math.PI / 2 ); var mx1 = d.source.x + (bodySize * Math.cos(angle1)); var my1 = d.source.y - (bodySize * Math.sin(angle1)); var mx2 = d.source.x + (bodySize * Math.cos(angle2)); var my2 = d.source.y - (bodySize * Math.sin(angle2)); var mx3 = d.target.x - (bodySize * Math.cos(angle1)); var my3 = d.target.y + (bodySize * Math.sin(angle1)); var mx4 = d.target.x - (bodySize * Math.cos(angle2)); var my4 = d.target.y + (bodySize * Math.sin(angle2)); return "M" + mx1 + "," + my1 + "L" + mx2 + "," + my2 + "L" + mx3 + "," + my3 + "L" + mx4 + "," + my4 + "z"; } function taffy(d, nodeSourceSize, nodeTargetSize, midpointSize) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 - ( Math.PI / 2 ); var angle2 = angle0 + ( Math.PI / 2 ); var x1 = d.source.x + (nodeSourceSize * Math.cos(angle1)); var y1 = d.source.y - (nodeSourceSize * Math.sin(angle1)); var x2 = d.source.x + (nodeSourceSize * Math.cos(angle2)); var y2 = d.source.y - (nodeSourceSize * Math.sin(angle2)); var x3 = d.target.x + (nodeTargetSize * Math.cos(angle2)); var y3 = d.target.y - (nodeTargetSize * Math.sin(angle2)); var x4 = d.target.x + (nodeTargetSize * Math.cos(angle1)); var y4 = d.target.y - (nodeTargetSize * Math.sin(angle1)); var mx1 = d.source.x + (midpointSize * Math.cos(angle1)); var my1 = d.source.y - (midpointSize * Math.sin(angle1)); var mx2 = d.source.x + (midpointSize * Math.cos(angle2)); var my2 = d.source.y - (midpointSize * Math.sin(angle2)); var mx3 = d.target.x + (midpointSize * Math.cos(angle1)); var my3 = d.target.y - (midpointSize * Math.sin(angle1)); var mx4 = d.target.x + (midpointSize * Math.cos(angle2)); var my4 = d.target.y - (midpointSize * Math.sin(angle2)); var midY2 = (my1 + my3) / 2; var midX2 = (mx1 + mx3) / 2; var midY1 = (my2 + my4) / 2; var midX1 = (mx2 + mx4) / 2; return "M" + x1 + "," + y1 + "L" + x2 + "," + y2 + " L " + midX1 + "," + midY1 + " L " + x3 + "," + y3 + " L " + x4 + "," + y4 + " L " + midX2 + "," + midY2 + "z"; }; function nail(d, nodeSize) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 - ( Math.PI / 2 ); var angle2 = angle0 + ( Math.PI / 2 ); var x1 = d.source.x + (nodeSize * Math.cos(angle1)); var y1 = d.source.y - (nodeSize * Math.sin(angle1)); var x2 = d.source.x + (nodeSize * Math.cos(angle2)); var y2 = d.source.y - (nodeSize * Math.sin(angle2)); return "M" + x1 + "," + y1 + "L" + x2 + "," + y2 + " L " + d.target.x + "," + d.target.y + "z"; }; function comet(d, nodeSize) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 - ( Math.PI / 2 ); var angle2 = angle0 + ( Math.PI / 2 ); var x1 = d.target.x + (nodeSize * Math.cos(angle1)); var y1 = d.target.y - (nodeSize * Math.sin(angle1)); var x2 = d.target.x + (nodeSize * Math.cos(angle2)); var y2 = d.target.y - (nodeSize * Math.sin(angle2)); return "M" + x1 + "," + y1 + "L" + x2 + "," + y2 + " L " + d.source.x + "," + d.source.y + "z"; }; function arrowhead(d, nodeTargetSize, bodySize, headSize) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var headDistance = headSize * 3; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 - ( Math.PI / 2 ); var angle2 = angle0 + ( Math.PI / 2 ); var x1 = d.source.x + (headSize * Math.cos(angle1)); var y1 = d.source.y - (headSize * Math.sin(angle1)); var x2 = d.source.x + (headSize * Math.cos(angle2)); var y2 = d.source.y - (headSize * Math.sin(angle2)); var x3 = d.target.x - (headSize * Math.cos(angle1)); var y3 = d.target.y + (headSize * Math.sin(angle1)); var x4 = d.target.x - (headSize * Math.cos(angle2)); var y4 = d.target.y + (headSize * Math.sin(angle2)); var mx1 = d.source.x + (bodySize * Math.cos(angle1)); var my1 = d.source.y - (bodySize * Math.sin(angle1)); var mx2 = d.source.x + (bodySize * Math.cos(angle2)); var my2 = d.source.y - (bodySize * Math.sin(angle2)); var mx3 = d.target.x + (bodySize * Math.cos(angle1)); var my3 = d.target.y - (bodySize * Math.sin(angle1)); var mx4 = d.target.x + (bodySize * Math.cos(angle2)); var my4 = d.target.y - (bodySize * Math.sin(angle2)); var dY = d.source.y - d.target.y; var dX = d.source.x - d.target.x; var midDiffY1 = my1 - my3; var midDiffX1 = mx1 - mx3; var midDiffY2 = my2 - my4; var midDiffX2 = mx2 - mx4; var diffY1 = y1 - y3; var diffX1 = x1 - x3; var diffY2 = y2 - y4; var diffX2 = x2 - x4; var pythag = Math.sqrt((midDiffX1 * midDiffX1) + (midDiffY1 * midDiffY1)); var pythag2 = Math.sqrt((dX * dX) + (dY * dY)); var adjX1 = mx2 - ((midDiffX1 * (pythag - headDistance - nodeTargetSize)) / pythag); var adjY1 = my2 - ((midDiffY1 * (pythag - headDistance - nodeTargetSize)) / pythag); var adjX2 = mx1 - ((midDiffX2 * (pythag - headDistance - nodeTargetSize)) / pythag); var adjY2 = my1 - ((midDiffY2 * (pythag - headDistance - nodeTargetSize)) / pythag); var headX2 = x1 - ((diffX2 * (pythag - headDistance - nodeTargetSize)) / pythag); var headY2 = y1 - ((diffY2 * (pythag - headDistance - nodeTargetSize)) / pythag); var headX1 = x2 - ((diffX1 * (pythag - headDistance - nodeTargetSize)) / pythag); var headY1 = y2 - ((diffY1 * (pythag - headDistance - nodeTargetSize)) / pythag); var tipX = d.source.x - ((dX * (pythag2 - nodeTargetSize)) / pythag2); var tipY = d.source.y - ((dY * (pythag2 - nodeTargetSize)) / pythag2); return "M" + mx2 + "," + my2 + "L" + adjX1 + "," + adjY1 + "L" + headX1 + "," + headY1 + "L" + tipX + "," + tipY + "L" + headX2 + "," + headY2 + "L" + adjX2 + "," + adjY2 + "L" + mx1 + "," + my1 + "z"; }; function parallel(d, sourceSize, targetSize, edgeNumber) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 + ( (Math.PI * 0.75) + (edgeNumber * 0.25) ); var angle2 = angle0 + ( (Math.PI * 0.25) - (edgeNumber * 0.25) ); var x1 = d.source.x + (sourceSize * Math.cos(angle1)); var y1 = d.source.y - (sourceSize * Math.sin(angle1)); var x2 = d.target.x + (targetSize * Math.cos(angle2)); var y2 = d.target.y - (targetSize * Math.sin(angle2)); return {source: {x: x1, y: y1}, target: {x: x2, y: y2}}; } function offset(d, nodeSize) { var diffX = d.target.y - d.source.y; var diffY = d.target.x - d.source.x; var angle0 = ( Math.atan2( diffY, diffX ) + ( Math.PI / 2 ) ); var angle1 = angle0 + ( Math.PI * 0.75 ); var angle2 = angle0 + ( Math.PI * 0.25 ); var x1 = d.source.x + (nodeSize * Math.cos(angle1)); var y1 = d.source.y - (nodeSize * Math.sin(angle1)); var x2 = d.target.x + (nodeSize * Math.cos(angle2)); var y2 = d.target.y - (nodeSize * Math.sin(angle2)); return {source: {x: x1, y: y1}, target: {x: x2, y: y2}}; } function particle(d, path, pathWidth, speed) { pathWidth = pathWidth / 2; d.particles = d.particles.filter(function (d) {return d.current < path.getTotalLength()}); if (d.frequency < 1) { if (Math.random() < d.frequency) { pushParticle(); } } else { for (var x = 0; x < d.frequency; x++) { pushParticle(); } } function pushParticle() { d.particles.push({current: 0, xOffset: pathWidth - (pathWidth * Math.random() * 2), yOffset: pathWidth - (pathWidth * Math.random() * 2)}); } d.particles.forEach(function (particle) { particle.current = particle.current + speed; var currentPosition = path.getPointAtLength(particle.current); particle.x = currentPosition.x + particle.xOffset; particle.y = currentPosition.y + particle.yOffset; }); }; var d = { arrowhead: arrowhead, comet: comet, nail: nail, taffy: taffy, ribbon: ribbon, lineArc: lineArc, halfArrow: halfArrow }; var project = { offset: offset, parallel: parallel } var mutate = { particle: particle } var version = "1.0.0"; exports.version = version; exports.d = d; exports.project = project; exports.mutate = mutate; }));