tldraw
Version:
A tiny little drawing editor.
8 lines (7 loc) • 27.3 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../../src/lib/shapes/geo/getGeoShapePath.ts"],
"sourcesContent": ["import {\n\tcenterOfCircleFromThreePoints,\n\tclamp,\n\texhaustiveSwitchError,\n\tgetPointOnCircle,\n\tgetPolygonVertices,\n\tHALF_PI,\n\tPI,\n\tPI2,\n\trng,\n\tTLDefaultDashStyle,\n\tTLDefaultSizeStyle,\n\tTLGeoShape,\n\tVec,\n\tVecModel,\n\tWeakCache,\n} from '@tldraw/editor'\nimport { STROKE_SIZES } from '../arrow/shared'\nimport { PathBuilder } from '../shared/PathBuilder'\n\nconst pathCache = new WeakCache<TLGeoShape, PathBuilder>()\nexport function getGeoShapePath(shape: TLGeoShape) {\n\treturn pathCache.get(shape, _getGeoPath)\n}\n\nfunction _getGeoPath(shape: TLGeoShape) {\n\tconst w = Math.max(1, shape.props.w)\n\tconst h = Math.max(1, shape.props.h + shape.props.growY)\n\tconst cx = w / 2\n\tconst cy = h / 2\n\tconst sw = STROKE_SIZES[shape.props.size] * shape.props.scale\n\n\tconst isFilled = shape.props.fill !== 'none'\n\n\tswitch (shape.props.geo) {\n\t\tcase 'arrow-down': {\n\t\t\tconst ox = w * 0.16\n\t\t\tconst oy = Math.min(w, h) * 0.38\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(ox, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w - ox, 0)\n\t\t\t\t.lineTo(w - ox, h - oy)\n\t\t\t\t.lineTo(w, h - oy)\n\t\t\t\t.lineTo(w / 2, h)\n\t\t\t\t.lineTo(0, h - oy)\n\t\t\t\t.lineTo(ox, h - oy)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'arrow-left': {\n\t\t\tconst ox = Math.min(w, h) * 0.38\n\t\t\tconst oy = h * 0.16\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(ox, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(ox, oy)\n\t\t\t\t.lineTo(w, oy)\n\t\t\t\t.lineTo(w, h - oy)\n\t\t\t\t.lineTo(ox, h - oy)\n\t\t\t\t.lineTo(ox, h)\n\t\t\t\t.lineTo(0, h / 2)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'arrow-right': {\n\t\t\tconst ox = Math.min(w, h) * 0.38\n\t\t\tconst oy = h * 0.16\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(0, oy, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w - ox, oy)\n\t\t\t\t.lineTo(w - ox, 0)\n\t\t\t\t.lineTo(w, h / 2)\n\t\t\t\t.lineTo(w - ox, h)\n\t\t\t\t.lineTo(w - ox, h - oy)\n\t\t\t\t.lineTo(0, h - oy)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'arrow-up': {\n\t\t\tconst ox = w * 0.16\n\t\t\tconst oy = Math.min(w, h) * 0.38\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(w / 2, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w, oy)\n\t\t\t\t.lineTo(w - ox, oy)\n\t\t\t\t.lineTo(w - ox, h)\n\t\t\t\t.lineTo(ox, h)\n\t\t\t\t.lineTo(ox, oy)\n\t\t\t\t.lineTo(0, oy)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'check-box': {\n\t\t\tconst size = Math.min(w, h) * 0.82\n\t\t\tconst ox = (w - size) / 2\n\t\t\tconst oy = (h - size) / 2\n\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(0, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w, 0)\n\t\t\t\t.lineTo(w, h)\n\t\t\t\t.lineTo(0, h)\n\t\t\t\t.close()\n\t\t\t\t.moveTo(clamp(ox + size * 0.25, 0, w), clamp(oy + size * 0.52, 0, h), {\n\t\t\t\t\tgeometry: { isInternal: true, isFilled: false },\n\t\t\t\t\toffset: 0,\n\t\t\t\t})\n\t\t\t\t.lineTo(clamp(ox + size * 0.45, 0, w), clamp(oy + size * 0.82, 0, h))\n\t\t\t\t.lineTo(clamp(ox + size * 0.82, 0, w), clamp(oy + size * 0.22, 0, h), { offset: 0 })\n\t\t}\n\t\tcase 'diamond':\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(cx, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w, cy)\n\t\t\t\t.lineTo(cx, h)\n\t\t\t\t.lineTo(0, cy)\n\t\t\t\t.close()\n\t\tcase 'ellipse':\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(0, cy, { geometry: { isFilled } })\n\t\t\t\t.arcTo(cx, cy, false, true, 0, w, cy)\n\t\t\t\t.arcTo(cx, cy, false, true, 0, 0, cy)\n\t\t\t\t.close()\n\t\tcase 'heart': {\n\t\t\tconst o = w / 4\n\t\t\tconst k = h / 4\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(cx, h, { geometry: { isFilled } })\n\t\t\t\t.cubicBezierTo(0, k * 1.2, o * 1.5, k * 3, 0, k * 2.5)\n\t\t\t\t.cubicBezierTo(cx, k * 0.9, 0, -k * 0.32, o * 1.85, -k * 0.32)\n\t\t\t\t.cubicBezierTo(w, k * 1.2, o * 2.15, -k * 0.32, w, -k * 0.32)\n\t\t\t\t.cubicBezierTo(cx, h, w, k * 2.5, o * 2.5, k * 3)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'hexagon':\n\t\t\treturn PathBuilder.lineThroughPoints(getPolygonVertices(w, h, 6), {\n\t\t\t\tgeometry: { isFilled },\n\t\t\t}).close()\n\t\tcase 'octagon':\n\t\t\treturn PathBuilder.lineThroughPoints(getPolygonVertices(w, h, 8), {\n\t\t\t\tgeometry: { isFilled },\n\t\t\t}).close()\n\t\tcase 'oval':\n\t\t\treturn getStadiumPath(w, h, isFilled)\n\t\tcase 'pentagon':\n\t\t\treturn PathBuilder.lineThroughPoints(getPolygonVertices(w, h, 5), {\n\t\t\t\tgeometry: { isFilled },\n\t\t\t}).close()\n\t\tcase 'rectangle':\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(0, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w, 0)\n\t\t\t\t.lineTo(w, h)\n\t\t\t\t.lineTo(0, h)\n\t\t\t\t.close()\n\t\tcase 'rhombus': {\n\t\t\tconst offset = Math.min(w * 0.38, h * 0.38)\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(offset, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w, 0)\n\t\t\t\t.lineTo(w - offset, h)\n\t\t\t\t.lineTo(0, h)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'rhombus-2': {\n\t\t\tconst offset = Math.min(w * 0.38, h * 0.38)\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(0, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w - offset, 0)\n\t\t\t\t.lineTo(w, h)\n\t\t\t\t.lineTo(offset, h)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'star':\n\t\t\treturn getStarPath(w, h, isFilled)\n\t\tcase 'trapezoid': {\n\t\t\tconst offset = Math.min(w * 0.38, h * 0.38)\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(offset, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w - offset, 0)\n\t\t\t\t.lineTo(w, h)\n\t\t\t\t.lineTo(0, h)\n\t\t\t\t.close()\n\t\t}\n\t\tcase 'triangle':\n\t\t\treturn new PathBuilder()\n\t\t\t\t.moveTo(cx, 0, { geometry: { isFilled } })\n\t\t\t\t.lineTo(w, h)\n\t\t\t\t.lineTo(0, h)\n\t\t\t\t.close()\n\t\tcase 'x-box':\n\t\t\treturn getXBoxPath(w, h, sw, shape.props.dash, isFilled)\n\n\t\tcase 'cloud':\n\t\t\treturn getCloudPath(w, h, shape.id, shape.props.size, shape.props.scale, isFilled)\n\t\tdefault:\n\t\t\texhaustiveSwitchError(shape.props.geo)\n\t}\n}\n\nfunction getXBoxPath(\n\tw: number,\n\th: number,\n\tsw: number,\n\tdash: TLDefaultDashStyle,\n\tisFilled: boolean\n) {\n\tconst cx = w / 2\n\tconst cy = h / 2\n\n\tconst path = new PathBuilder()\n\t\t.moveTo(0, 0, { geometry: { isFilled } })\n\t\t.lineTo(w, 0)\n\t\t.lineTo(w, h)\n\t\t.lineTo(0, h)\n\t\t.close()\n\n\tif (dash === 'dashed' || dash === 'dotted') {\n\t\treturn path\n\t\t\t.moveTo(0, 0, {\n\t\t\t\tgeometry: { isInternal: true, isFilled: false },\n\t\t\t\tdashStart: 'skip',\n\t\t\t\tdashEnd: 'outset',\n\t\t\t})\n\t\t\t.lineTo(cx, cy)\n\t\t\t.moveTo(w, h, {\n\t\t\t\tgeometry: { isInternal: true, isFilled: false },\n\t\t\t\tdashStart: 'skip',\n\t\t\t\tdashEnd: 'outset',\n\t\t\t})\n\t\t\t.lineTo(cx, cy)\n\t\t\t.moveTo(0, h, {\n\t\t\t\tgeometry: { isInternal: true, isFilled: false },\n\t\t\t\tdashStart: 'skip',\n\t\t\t\tdashEnd: 'outset',\n\t\t\t})\n\t\t\t.lineTo(cx, cy)\n\t\t\t.moveTo(w, 0, {\n\t\t\t\tgeometry: { isInternal: true, isFilled: false },\n\t\t\t\tdashStart: 'skip',\n\t\t\t\tdashEnd: 'outset',\n\t\t\t})\n\t\t\t.lineTo(cx, cy)\n\t}\n\n\tconst inset = dash === 'draw' ? 0.62 : 0\n\n\tpath\n\t\t.moveTo(clamp(sw * inset, 0, w), clamp(sw * inset, 0, h), {\n\t\t\tgeometry: { isInternal: true, isFilled: false },\n\t\t})\n\t\t.lineTo(clamp(w - sw * inset, 0, w), clamp(h - sw * inset, 0, h))\n\t\t.moveTo(clamp(w - sw * inset, 0, w), clamp(sw * inset, 0, h))\n\t\t.lineTo(clamp(sw * inset, 0, w), clamp(h - sw * inset, 0, h))\n\n\treturn path\n}\n\nfunction getStadiumPath(w: number, h: number, isFilled: boolean) {\n\t// stadium:\n\tif (h > w) {\n\t\tconst r = w / 2\n\t\treturn new PathBuilder()\n\t\t\t.moveTo(0, r, { geometry: { isFilled } })\n\t\t\t.arcTo(r, r, false, true, 0, w, r)\n\t\t\t.lineTo(w, h - r)\n\t\t\t.arcTo(r, r, false, true, 0, 0, h - r)\n\t\t\t.close()\n\t}\n\n\tconst r = h / 2\n\treturn new PathBuilder()\n\t\t.moveTo(r, h, { geometry: { isFilled } })\n\t\t.arcTo(r, r, false, true, 0, r, 0)\n\t\t.lineTo(w - r, 0)\n\t\t.arcTo(r, r, false, true, 0, w - r, h)\n\t\t.close()\n}\n\nfunction getStarPath(w: number, h: number, isFilled: boolean) {\n\t// Most of this code is to offset the center, a 5 point star\n\t// will need to be moved downward because from its center [0,0]\n\t// it will have a bigger minY than maxY. This is because it'll\n\t// have 2 points at the bottom.\n\tconst sides = 5\n\tconst step = PI2 / sides / 2\n\tconst rightMostIndex = Math.floor(sides / 4) * 2\n\tconst leftMostIndex = sides * 2 - rightMostIndex\n\tconst topMostIndex = 0\n\tconst bottomMostIndex = Math.floor(sides / 2) * 2\n\tconst maxX = (Math.cos(-HALF_PI + rightMostIndex * step) * w) / 2\n\tconst minX = (Math.cos(-HALF_PI + leftMostIndex * step) * w) / 2\n\n\tconst minY = (Math.sin(-HALF_PI + topMostIndex * step) * h) / 2\n\tconst maxY = (Math.sin(-HALF_PI + bottomMostIndex * step) * h) / 2\n\tconst diffX = w - Math.abs(maxX - minX)\n\tconst diffY = h - Math.abs(maxY - minY)\n\tconst offsetX = w / 2 + minX - (w / 2 - maxX)\n\tconst offsetY = h / 2 + minY - (h / 2 - maxY)\n\n\tconst ratio = 1\n\tconst cx = (w - offsetX) / 2\n\tconst cy = (h - offsetY) / 2\n\tconst ox = (w + diffX) / 2\n\tconst oy = (h + diffY) / 2\n\tconst ix = (ox * ratio) / 2\n\tconst iy = (oy * ratio) / 2\n\n\treturn PathBuilder.lineThroughPoints(\n\t\tArray.from(Array(sides * 2), (_, i) => {\n\t\t\tconst theta = -HALF_PI + i * step\n\t\t\treturn new Vec(\n\t\t\t\tcx + (i % 2 ? ix : ox) * Math.cos(theta),\n\t\t\t\tcy + (i % 2 ? iy : oy) * Math.sin(theta)\n\t\t\t)\n\t\t}),\n\t\t{ geometry: { isFilled } }\n\t).close()\n}\n\n/* ---------------------- Cloud --------------------- */\n\nfunction getOvalPerimeter(h: number, w: number) {\n\tif (h > w) return (PI * (w / 2) + (h - w)) * 2\n\telse return (PI * (h / 2) + (w - h)) * 2\n}\n\ntype PillSection =\n\t| {\n\t\t\ttype: 'straight'\n\t\t\tstart: VecModel\n\t\t\tdelta: VecModel\n\t }\n\t| {\n\t\t\ttype: 'arc'\n\t\t\tcenter: VecModel\n\t\t\tstartAngle: number\n\t }\n\nfunction getPillPoints(width: number, height: number, numPoints: number) {\n\tconst radius = Math.min(width, height) / 2\n\tconst longSide = Math.max(width, height) - radius * 2\n\tconst circumference = Math.PI * (radius * 2) + 2 * longSide\n\tconst spacing = circumference / numPoints\n\n\tconst sections: PillSection[] =\n\t\twidth > height\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'straight',\n\t\t\t\t\t\tstart: new Vec(radius, 0),\n\t\t\t\t\t\tdelta: new Vec(1, 0),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'arc',\n\t\t\t\t\t\tcenter: new Vec(width - radius, radius),\n\t\t\t\t\t\tstartAngle: -PI / 2,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'straight',\n\t\t\t\t\t\tstart: new Vec(width - radius, height),\n\t\t\t\t\t\tdelta: new Vec(-1, 0),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'arc',\n\t\t\t\t\t\tcenter: new Vec(radius, radius),\n\t\t\t\t\t\tstartAngle: PI / 2,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'straight',\n\t\t\t\t\t\tstart: new Vec(width, radius),\n\t\t\t\t\t\tdelta: new Vec(0, 1),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'arc',\n\t\t\t\t\t\tcenter: new Vec(radius, height - radius),\n\t\t\t\t\t\tstartAngle: 0,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'straight',\n\t\t\t\t\t\tstart: new Vec(0, height - radius),\n\t\t\t\t\t\tdelta: new Vec(0, -1),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'arc',\n\t\t\t\t\t\tcenter: new Vec(radius, radius),\n\t\t\t\t\t\tstartAngle: PI,\n\t\t\t\t\t},\n\t\t\t\t]\n\n\tlet sectionOffset = 0\n\n\tconst points: Vec[] = []\n\tfor (let i = 0; i < numPoints; i++) {\n\t\tconst section = sections[0]\n\t\tif (section.type === 'straight') {\n\t\t\tpoints.push(Vec.Add(section.start, Vec.Mul(section.delta, sectionOffset)))\n\t\t} else {\n\t\t\tpoints.push(\n\t\t\t\tgetPointOnCircle(section.center, radius, section.startAngle + sectionOffset / radius)\n\t\t\t)\n\t\t}\n\t\tsectionOffset += spacing\n\t\tlet sectionLength = section.type === 'straight' ? longSide : PI * radius\n\t\twhile (sectionOffset > sectionLength) {\n\t\t\tsectionOffset -= sectionLength\n\t\t\tsections.push(sections.shift()!)\n\t\t\tsectionLength = sections[0].type === 'straight' ? longSide : PI * radius\n\t\t}\n\t}\n\n\treturn points\n}\n\nconst SIZES: Record<TLDefaultSizeStyle, number> = {\n\ts: 50,\n\tm: 70,\n\tl: 100,\n\txl: 130,\n}\n\nconst BUMP_PROTRUSION = 0.2\n\nfunction getCloudPath(\n\twidth: number,\n\theight: number,\n\tseed: string,\n\tsize: TLDefaultSizeStyle,\n\tscale: number,\n\tisFilled: boolean\n) {\n\tconst path = new PathBuilder()\n\tconst getRandom = rng(seed)\n\tconst pillCircumference = getOvalPerimeter(width, height)\n\tconst numBumps = Math.max(\n\t\tMath.ceil(pillCircumference / SIZES[size]),\n\t\t6,\n\t\tMath.ceil(pillCircumference / Math.min(width, height))\n\t)\n\tconst targetBumpProtrusion = (pillCircumference / numBumps) * BUMP_PROTRUSION\n\n\t// if the aspect ratio is high, innerWidth should be smaller\n\tconst innerWidth = Math.max(width - targetBumpProtrusion * 2, 1)\n\tconst innerHeight = Math.max(height - targetBumpProtrusion * 2, 1)\n\tconst innerCircumference = getOvalPerimeter(innerWidth, innerHeight)\n\n\tconst distanceBetweenPointsOnPerimeter = innerCircumference / numBumps\n\n\tconst paddingX = (width - innerWidth) / 2\n\tconst paddingY = (height - innerHeight) / 2\n\tconst bumpPoints = getPillPoints(innerWidth, innerHeight, numBumps).map((p) => {\n\t\treturn p.addXY(paddingX, paddingY)\n\t})\n\tconst maxWiggleX = width < 20 ? 0 : targetBumpProtrusion * 0.3\n\tconst maxWiggleY = height < 20 ? 0 : targetBumpProtrusion * 0.3\n\n\t// wiggle the points from either end so that the bumps 'pop'\n\t// in at the bottom-right and the top-left looks relatively stable\n\t// note: it's important that we don't mutate here! these points are also the bump points\n\tconst wiggledPoints = bumpPoints.slice(0)\n\tfor (let i = 0; i < Math.floor(numBumps / 2); i++) {\n\t\twiggledPoints[i] = Vec.AddXY(\n\t\t\twiggledPoints[i],\n\t\t\tgetRandom() * maxWiggleX * scale,\n\t\t\tgetRandom() * maxWiggleY * scale\n\t\t)\n\t\twiggledPoints[numBumps - i - 1] = Vec.AddXY(\n\t\t\twiggledPoints[numBumps - i - 1],\n\t\t\tgetRandom() * maxWiggleX * scale,\n\t\t\tgetRandom() * maxWiggleY * scale\n\t\t)\n\t}\n\n\tfor (let i = 0; i < wiggledPoints.length; i++) {\n\t\tconst j = i === wiggledPoints.length - 1 ? 0 : i + 1\n\t\tconst leftWigglePoint = wiggledPoints[i]\n\t\tconst rightWigglePoint = wiggledPoints[j]\n\t\tconst leftPoint = bumpPoints[i]\n\t\tconst rightPoint = bumpPoints[j]\n\n\t\t// when the points are on the curvy part of a pill, there is a natural arc that we need to extends past\n\t\t// otherwise it looks like the bumps get less bumpy on the curvy parts\n\t\tconst distanceBetweenOriginalPoints = Vec.Dist(leftPoint, rightPoint)\n\t\tconst curvatureOffset = distanceBetweenPointsOnPerimeter - distanceBetweenOriginalPoints\n\t\tconst distanceBetweenWigglePoints = Vec.Dist(leftWigglePoint, rightWigglePoint)\n\t\tconst relativeSize = distanceBetweenWigglePoints / distanceBetweenOriginalPoints\n\t\tconst finalDistance = (Math.max(paddingX, paddingY) + curvatureOffset) * relativeSize\n\n\t\tconst arcPoint = Vec.Lrp(leftPoint, rightPoint, 0.5).add(\n\t\t\tVec.Sub(rightPoint, leftPoint).uni().per().mul(finalDistance)\n\t\t)\n\t\tif (arcPoint.x < 0) {\n\t\t\tarcPoint.x = 0\n\t\t} else if (arcPoint.x > width) {\n\t\t\tarcPoint.x = width\n\t\t}\n\t\tif (arcPoint.y < 0) {\n\t\t\tarcPoint.y = 0\n\t\t} else if (arcPoint.y > height) {\n\t\t\tarcPoint.y = height\n\t\t}\n\n\t\tconst center = centerOfCircleFromThreePoints(leftWigglePoint, rightWigglePoint, arcPoint)\n\n\t\tconst radius = Vec.Dist(\n\t\t\tcenter ? center : Vec.Average([leftWigglePoint, rightWigglePoint]),\n\t\t\tleftWigglePoint\n\t\t)\n\n\t\tif (i === 0) {\n\t\t\tpath.moveTo(leftWigglePoint.x, leftWigglePoint.y, { geometry: { isFilled } })\n\t\t}\n\n\t\tpath.circularArcTo(radius, false, true, rightWigglePoint.x, rightWigglePoint.y)\n\t}\n\n\treturn path.close()\n}\n"],
"mappings": "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",
"names": ["r"]
}