{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "geometry-utils", "registryDependencies": [], "files": [ { "path": "src/lib/geometryUtils.ts", "content": "const resolvePointsFromLine = (\n points: { x: number; y: number }[],\n height: number,\n width: number\n) => {\n const resolvedPoints = points.map((point) => {\n const { x, y } = point;\n if (x <= width) {\n return { x, y };\n } else if (x <= width + height) {\n return { x: width - y, y: x - width };\n } else if (x <= width + height + width) {\n return { x: width - (x - (height + width)), y: height - y };\n } else {\n return { x: y, y: height - (x - (width + height + width)) };\n }\n });\n\n return resolvedPoints;\n};\n\n// generate a straight line of points\n// with a random height variance\nexport const getRectangularPoints = (args: {\n height: number;\n width: number;\n peakSeparation: number;\n heightVariance: number;\n}) => {\n const { height, width, peakSeparation, heightVariance } = args;\n const pickPoints = [];\n let currentX = 0;\n\n while (currentX < 2 * (width + height)) {\n currentX = currentX + (0.5 + Math.random()) * peakSeparation;\n\n pickPoints.push({ x: currentX, y: Math.random() * heightVariance });\n }\n\n const distanceBetweenFirstAndLast = Math.sqrt(\n Math.pow(pickPoints[0].x - pickPoints[pickPoints.length - 1].x, 2) +\n Math.pow(pickPoints[0].y - pickPoints[pickPoints.length - 1].y, 2)\n );\n\n if (distanceBetweenFirstAndLast < 0.4 * peakSeparation) {\n pickPoints.splice(pickPoints.length - 1, 1);\n }\n\n return resolvePointsFromLine(pickPoints, height, width);\n};\n\nexport const getEllipticalPoints = (args: {\n height: number;\n width: number;\n peakSeparation: number;\n heightVariance: number;\n}) => {\n const { height, width, peakSeparation, heightVariance } = args;\n\n const r = (width + height) / 4;\n const theta = peakSeparation / r;\n const a = width / 2;\n const b = height / 2;\n const peaksCounts = Math.ceil((2 * Math.PI) / theta);\n\n const pickPoints = Array(peaksCounts)\n .fill(null)\n .map((_, index) => ({\n x:\n a +\n a * Math.cos(theta * index) +\n (Math.random() - 0.5) * heightVariance,\n y:\n b +\n b * Math.sin(theta * index) +\n (Math.random() - 0.5) * heightVariance,\n }));\n\n const distanceBetweenFirstAndLast = Math.sqrt(\n Math.pow(pickPoints[0].x - pickPoints[pickPoints.length - 1].x, 2) +\n Math.pow(pickPoints[0].y - pickPoints[pickPoints.length - 1].y, 2)\n );\n\n if (distanceBetweenFirstAndLast < 0.4 * peakSeparation) {\n pickPoints.splice(pickPoints.length - 1, 1);\n }\n\n return pickPoints;\n};\n", "type": "registry:lib" } ], "type": "registry:lib" }