UNPKG

tldraw

Version:

A tiny little drawing editor.

8 lines (7 loc) 8.63 kB
{ "version": 3, "sources": ["../../../../src/lib/shapes/arrow/arrowheads.ts"], "sourcesContent": ["import {\n\tHALF_PI,\n\tPI,\n\tVec,\n\tVecLike,\n\tclamp,\n\texhaustiveSwitchError,\n\tintersectCircleCircle,\n} from '@tldraw/editor'\nimport { TLArrowInfo } from './arrow-types'\n\ninterface TLArrowPointsInfo {\n\tpoint: VecLike\n\tint: VecLike\n}\n\nfunction getArrowPoints(\n\tinfo: TLArrowInfo,\n\tside: 'start' | 'end',\n\tstrokeWidth: number\n): TLArrowPointsInfo {\n\tconst point = side === 'end' ? info.end.point : info.start.point\n\tlet int: VecLike\n\n\tswitch (info.type) {\n\t\tcase 'straight': {\n\t\t\tconst opposite = side === 'end' ? info.start.point : info.end.point\n\t\t\tconst compareLength = Vec.Dist(opposite, point)\n\t\t\tconst length = clamp(compareLength / 5, strokeWidth, strokeWidth * 3)\n\t\t\tint = Vec.Nudge(point, opposite, length)\n\t\t\tbreak\n\t\t}\n\t\tcase 'arc': {\n\t\t\tconst compareLength = Math.abs(info.bodyArc.length)\n\t\t\tconst length = clamp(compareLength / 5, strokeWidth, strokeWidth * 3)\n\t\t\tconst intersections = intersectCircleCircle(\n\t\t\t\tpoint,\n\t\t\t\tlength,\n\t\t\t\tinfo.handleArc.center,\n\t\t\t\tinfo.handleArc.radius\n\t\t\t)\n\t\t\tint =\n\t\t\t\tside === 'end'\n\t\t\t\t\t? info.handleArc.sweepFlag\n\t\t\t\t\t\t? intersections[0]\n\t\t\t\t\t\t: intersections[1]\n\t\t\t\t\t: info.handleArc.sweepFlag\n\t\t\t\t\t\t? intersections[1]\n\t\t\t\t\t\t: intersections[0]\n\t\t\tbreak\n\t\t}\n\t\tcase 'elbow': {\n\t\t\tconst previousPoint =\n\t\t\t\tside === 'end' ? info.route.points[info.route.points.length - 2] : info.route.points[1]\n\t\t\tconst previousSegmentLength = Vec.ManhattanDist(previousPoint, point)\n\t\t\tconst length = clamp(previousSegmentLength / 2, strokeWidth, strokeWidth * 3)\n\t\t\tint = previousPoint ? Vec.Nudge(point, previousPoint, length) : point\n\t\t\tbreak\n\t\t}\n\t\tdefault:\n\t\t\texhaustiveSwitchError(info, 'type')\n\t}\n\n\tif (Vec.IsNaN(int)) {\n\t\tint = point\n\t}\n\n\treturn { point, int }\n}\n\nfunction getArrowhead({ point, int }: TLArrowPointsInfo) {\n\tconst PL = Vec.RotWith(int, point, PI / 6)\n\tconst PR = Vec.RotWith(int, point, -PI / 6)\n\n\treturn `M ${PL.x} ${PL.y} L ${point.x} ${point.y} L ${PR.x} ${PR.y}`\n}\n\nfunction getTriangleHead({ point, int }: TLArrowPointsInfo) {\n\tconst PL = Vec.RotWith(int, point, PI / 6)\n\tconst PR = Vec.RotWith(int, point, -PI / 6)\n\n\treturn `M ${PL.x} ${PL.y} L ${PR.x} ${PR.y} L ${point.x} ${point.y} Z`\n}\n\nfunction getInvertedTriangleHead({ point, int }: TLArrowPointsInfo) {\n\tconst d = Vec.Sub(int, point).div(2)\n\tconst PL = Vec.Add(point, Vec.Rot(d, HALF_PI))\n\tconst PR = Vec.Sub(point, Vec.Rot(d, HALF_PI))\n\n\treturn `M ${PL.x} ${PL.y} L ${int.x} ${int.y} L ${PR.x} ${PR.y} Z`\n}\n\nfunction getDotHead({ point, int }: TLArrowPointsInfo) {\n\tconst A = Vec.Lrp(point, int, 0.45)\n\tconst r = Vec.Dist(A, point)\n\n\treturn `M ${A.x - r},${A.y}\n a ${r},${r} 0 1,0 ${r * 2},0\n a ${r},${r} 0 1,0 -${r * 2},0 `\n}\n\nfunction getDiamondHead({ point, int }: TLArrowPointsInfo) {\n\tconst PB = Vec.Lrp(point, int, 0.75)\n\tconst PL = Vec.RotWith(PB, point, PI / 4)\n\tconst PR = Vec.RotWith(PB, point, -PI / 4)\n\n\tconst PQ = Vec.Lrp(PL, PR, 0.5)\n\tPQ.add(Vec.Sub(PQ, point))\n\n\treturn `M ${PQ.x} ${PQ.y} L ${PR.x} ${PR.y} ${point.x} ${point.y} L ${PL.x} ${PL.y} Z`\n}\n\nfunction getSquareHead({ int, point }: TLArrowPointsInfo) {\n\tconst PB = Vec.Lrp(point, int, 0.85)\n\tconst d = Vec.Sub(PB, point).div(2)\n\tconst PL1 = Vec.Add(point, Vec.Rot(d, HALF_PI))\n\tconst PR1 = Vec.Sub(point, Vec.Rot(d, HALF_PI))\n\tconst PL2 = Vec.Add(PB, Vec.Rot(d, HALF_PI))\n\tconst PR2 = Vec.Sub(PB, Vec.Rot(d, HALF_PI))\n\n\treturn `M ${PL1.x} ${PL1.y} L ${PL2.x} ${PL2.y} L ${PR2.x} ${PR2.y} L ${PR1.x} ${PR1.y} Z`\n}\n\nfunction getBarHead({ int, point }: TLArrowPointsInfo) {\n\tconst d = Vec.Sub(int, point).div(2)\n\n\tconst PL = Vec.Add(point, Vec.Rot(d, HALF_PI))\n\tconst PR = Vec.Sub(point, Vec.Rot(d, HALF_PI))\n\n\treturn `M ${PL.x} ${PL.y} L ${PR.x} ${PR.y}`\n}\n\n/** @public */\nexport function getArrowheadPathForType(\n\tinfo: TLArrowInfo,\n\tside: 'start' | 'end',\n\tstrokeWidth: number\n): string | undefined {\n\tconst type = side === 'end' ? info.end.arrowhead : info.start.arrowhead\n\tif (type === 'none') return\n\n\tconst points = getArrowPoints(info, side, strokeWidth)\n\tif (!points) return\n\n\tswitch (type) {\n\t\tcase 'bar':\n\t\t\treturn getBarHead(points)\n\t\tcase 'square':\n\t\t\treturn getSquareHead(points)\n\t\tcase 'diamond':\n\t\t\treturn getDiamondHead(points)\n\t\tcase 'dot':\n\t\t\treturn getDotHead(points)\n\t\tcase 'inverted':\n\t\t\treturn getInvertedTriangleHead(points)\n\t\tcase 'arrow':\n\t\t\treturn getArrowhead(points)\n\t\tcase 'triangle':\n\t\t\treturn getTriangleHead(points)\n\t}\n\n\treturn ''\n}\n"], "mappings": "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", "names": [] }