{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-pipes-and-filters/src/client/triples/math.js"],"names":["d3","calculateCenter","calculateIntersection","calculateAngle","calculateRadian","calculateLoopPath","calculateNormalVector","loopFunction","line","x","d","y","curve","curveNatural","source","target","length","dx","dy","nx","ny","vlength","Math","sqrt","ratio","link","node","subject","label","triple","fairShareLoopAngle","loops","fairShareLoopAngleWithMargin","loopAngle","min","labelRadian","atan2","labelAngle","startAngle","endAngle","arcFrom","arcTo","x1","cos","actualRadius","y1","sin","x2","y2","fixPoint1","fixPoint2","angle","PI","radian","additionalDistance","innerDistance","distanceToBorder","firstPoint","secondPoint"],"mappings":"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","file":"math.js","sourcesContent":["import d3 from 'src/external/d3.v4.js';\r\n\r\n/**\r\n * Contains a collection of mathematical functions with some additional data\r\n * used for WebVOWL.\r\n */\r\n\r\nlet loopFunction = d3.line()\r\n\t.x(function (d) {\r\n\t\treturn d.x;\r\n\t})\r\n\t.y(function (d) {\r\n\t\treturn d.y;\r\n\t})\r\n\t.curve(d3.curveNatural)\r\n//\t.interpolate(\"cardinal\")\r\n\t//.tension(-1);\r\n\r\n\r\n/**\r\n * Calculates the normal vector of the path between the two nodes.\r\n * @param source the first node\r\n * @param target the second node\r\n * @param length the length of the calculated normal vector\r\n * @returns {{x: number, y: number}}\r\n */\r\nexport function calculateNormalVector(source, target, length) {\r\n\tvar dx = target.x - source.x,\r\n\t\tdy = target.y - source.y;\r\n\r\n\tvar nx = -dy,\r\n\t\tny = dx;\r\n\r\n\tvar vlength = Math.sqrt(nx * nx + ny * ny);\r\n\r\n\tvar ratio = vlength !== 0 ? length / vlength : 0;\r\n\r\n\treturn {\"x\": nx * ratio, \"y\": ny * ratio};\r\n};\r\n\r\n/**\r\n * Calculates the path for a link, if it is a loop. Currently only working for circlular nodes.\r\n * @param link the link\r\n * @returns {*}\r\n */\r\nexport function calculateLoopPath(link) {\r\n\tvar node = link.subject,\r\n\t\tlabel = link.triple;\r\n\r\n\tvar fairShareLoopAngle = 360 / link.loops(),\r\n\t\tfairShareLoopAngleWithMargin = fairShareLoopAngle * 0.8,\r\n\t\tloopAngle = Math.min(60, fairShareLoopAngleWithMargin);\r\n\r\n\tvar dx = label.x - node.x,\r\n\t\tdy = label.y - node.y,\r\n\t\tlabelRadian = Math.atan2(dy, dx),\r\n\t\tlabelAngle = calculateAngle(labelRadian);\r\n\r\n\tvar startAngle = labelAngle - loopAngle / 2,\r\n\t\tendAngle = labelAngle + loopAngle / 2;\r\n\r\n\tvar arcFrom = calculateRadian(startAngle),\r\n\t\tarcTo = calculateRadian(endAngle),\r\n\r\n\t\tx1 = Math.cos(arcFrom) * node.actualRadius(),\r\n\t\ty1 = Math.sin(arcFrom) * node.actualRadius(),\r\n\r\n\t\tx2 = Math.cos(arcTo) * node.actualRadius(),\r\n\t\ty2 = Math.sin(arcTo) * node.actualRadius(),\r\n\r\n\t\tfixPoint1 = {\"x\": node.x + x1, \"y\": node.y + y1},\r\n\t\tfixPoint2 = {\"x\": node.x + x2, \"y\": node.y + y2};\r\n\r\n\treturn loopFunction([fixPoint1, link.triple, fixPoint2]);\r\n};\r\n\r\n/**\r\n * @param angle\r\n * @returns {number} the radian of the angle\r\n */\r\nfunction calculateRadian(angle) {\r\n\tangle = angle % 360;\r\n\tif (angle < 0) {\r\n\t\tangle = angle + 360;\r\n\t}\r\n\treturn (Math.PI * angle) / 180;\r\n}\r\n\r\n/**\r\n * @param radian\r\n * @returns {number} the angle of the radian\r\n */\r\nfunction calculateAngle(radian) {\r\n\treturn radian * (180 / Math.PI);\r\n}\r\n\r\n/**\r\n * Calculates the point where the link between the source and target node\r\n * intersects the border of the target node.\r\n * @param source the source node\r\n * @param target the target node\r\n * @param additionalDistance additional distance the\r\n * @returns {{x: number, y: number}}\r\n */\r\nexport function calculateIntersection(source, target, additionalDistance) {\r\n\tvar dx = target.x - source.x,\r\n\t\tdy = target.y - source.y,\r\n\t\tlength = Math.sqrt(dx * dx + dy * dy);\r\n\r\n\tif (length === 0) {\r\n\t\treturn {x: source.x, y: source.y};\r\n\t}\r\n\r\n\tvar innerDistance = target.distanceToBorder(dx, dy);\r\n\r\n\tvar ratio = (length - (innerDistance + additionalDistance)) / length,\r\n\t\tx = dx * ratio + source.x,\r\n\t\ty = dy * ratio + source.y;\r\n\r\n\treturn {x: x, y: y};\r\n};\r\n\r\n/**\r\n * Calculates the position between the two points.\r\n * @param firstPoint\r\n * @param secondPoint\r\n * @returns {{x: number, y: number}}\r\n */\r\nexport function calculateCenter(firstPoint, secondPoint) {\r\n\treturn {\r\n\t\tx: (firstPoint.x + secondPoint.x) / 2,\r\n\t\ty: (firstPoint.y + secondPoint.y) / 2\r\n\t};\r\n};\r\n"]}