@tscircuit/math-utils 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-AXPIDNML.js +42 -0
- package/dist/chunk-AXPIDNML.js.map +1 -0
- package/dist/{chunk-KHV6IODO.js → chunk-CHQOCSFB.js} +1 -1
- package/dist/chunk-CHQOCSFB.js.map +1 -0
- package/dist/grid.d.ts +22 -0
- package/dist/grid.js +7 -0
- package/dist/grid.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -1
- package/dist/line-intersections.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-KHV6IODO.js.map +0 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/grid.ts
|
|
2
|
+
function grid({
|
|
3
|
+
rows,
|
|
4
|
+
cols,
|
|
5
|
+
xSpacing,
|
|
6
|
+
ySpacing,
|
|
7
|
+
width,
|
|
8
|
+
height,
|
|
9
|
+
offsetX = 0,
|
|
10
|
+
offsetY = 0,
|
|
11
|
+
yDirection = "cartesian"
|
|
12
|
+
}) {
|
|
13
|
+
const cellWidth = width ? width / cols : xSpacing ?? 1;
|
|
14
|
+
const cellHeight = height ? height / rows : ySpacing ?? 1;
|
|
15
|
+
const cells = [];
|
|
16
|
+
for (let row = 0; row < rows; row++) {
|
|
17
|
+
for (let col = 0; col < cols; col++) {
|
|
18
|
+
const index = row * cols + col;
|
|
19
|
+
const centerX = offsetX + col * cellWidth + cellWidth / 2;
|
|
20
|
+
const rawCenterY = offsetY + row * cellHeight + cellHeight / 2;
|
|
21
|
+
const centerY = yDirection === "cartesian" ? offsetY + (rows - 1 - row) * cellHeight + cellHeight / 2 : rawCenterY;
|
|
22
|
+
cells.push({
|
|
23
|
+
index,
|
|
24
|
+
center: { x: centerX, y: centerY },
|
|
25
|
+
topLeft: {
|
|
26
|
+
x: centerX - cellWidth / 2,
|
|
27
|
+
y: centerY + cellHeight / 2
|
|
28
|
+
},
|
|
29
|
+
bottomRight: {
|
|
30
|
+
x: centerX + cellWidth / 2,
|
|
31
|
+
y: centerY - cellHeight / 2
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return cells;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
grid
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=chunk-AXPIDNML.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/grid.ts"],"sourcesContent":["import type { Point } from \"./common\"\n\nexport type GridCellPositions = {\n index: number\n center: Point\n topLeft: Point\n bottomRight: Point\n}\n\nexport type GridOptions = {\n rows: number\n cols: number\n xSpacing?: number\n ySpacing?: number\n width?: number\n height?: number\n offsetX?: number\n offsetY?: number\n yDirection?: \"cartesian\" | \"up-is-negative\"\n}\n\nexport function grid({\n rows,\n cols,\n xSpacing,\n ySpacing,\n width,\n height,\n offsetX = 0,\n offsetY = 0,\n yDirection = \"cartesian\",\n}: GridOptions): GridCellPositions[] {\n // Calculate cell dimensions\n const cellWidth = width ? width / cols : (xSpacing ?? 1)\n const cellHeight = height ? height / rows : (ySpacing ?? 1)\n\n const cells: GridCellPositions[] = []\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const index = row * cols + col\n\n // Calculate center position\n const centerX = offsetX + col * cellWidth + cellWidth / 2\n const rawCenterY = offsetY + row * cellHeight + cellHeight / 2\n\n // Adjust Y coordinate based on yDirection\n const centerY =\n yDirection === \"cartesian\"\n ? offsetY + (rows - 1 - row) * cellHeight + cellHeight / 2\n : rawCenterY\n\n cells.push({\n index,\n center: { x: centerX, y: centerY },\n topLeft: {\n x: centerX - cellWidth / 2,\n y: centerY + cellHeight / 2,\n },\n bottomRight: {\n x: centerX + cellWidth / 2,\n y: centerY - cellHeight / 2,\n },\n })\n }\n }\n\n return cells\n}\n"],"mappings":";AAqBO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AACf,GAAqC;AAEnC,QAAM,YAAY,QAAQ,QAAQ,OAAQ,YAAY;AACtD,QAAM,aAAa,SAAS,SAAS,OAAQ,YAAY;AAEzD,QAAM,QAA6B,CAAC;AAEpC,WAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,aAAS,MAAM,GAAG,MAAM,MAAM,OAAO;AACnC,YAAM,QAAQ,MAAM,OAAO;AAG3B,YAAM,UAAU,UAAU,MAAM,YAAY,YAAY;AACxD,YAAM,aAAa,UAAU,MAAM,aAAa,aAAa;AAG7D,YAAM,UACJ,eAAe,cACX,WAAW,OAAO,IAAI,OAAO,aAAa,aAAa,IACvD;AAEN,YAAM,KAAK;AAAA,QACT;AAAA,QACA,QAAQ,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,QACjC,SAAS;AAAA,UACP,GAAG,UAAU,YAAY;AAAA,UACzB,GAAG,UAAU,aAAa;AAAA,QAC5B;AAAA,QACA,aAAa;AAAA,UACX,GAAG,UAAU,YAAY;AAAA,UACzB,GAAG,UAAU,aAAa;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/line-intersections.ts"],"sourcesContent":["import type { Point } from \"./common\"\n\n/**\n * Returns true if the two lines intersect.\n */\nexport function doesLineIntersectLine(\n [a1, a2]: [Point, Point],\n [b1, b2]: [Point, Point],\n {\n lineThickness = 0,\n }: {\n lineThickness?: number\n } = {},\n): boolean {\n if (lineThickness === 0) {\n return doSegmentsIntersect(a1, a2, b1, b2)\n }\n const minDist = segmentsDistance(a1, a2, b1, b2)\n return minDist <= lineThickness\n}\n\n/**\n * Returns true if the two segments intersect.\n */\nexport function doSegmentsIntersect(\n p1: Point,\n q1: Point,\n p2: Point,\n q2: Point,\n): boolean {\n const o1 = orientation(p1, q1, p2)\n const o2 = orientation(p1, q1, q2)\n const o3 = orientation(p2, q2, p1)\n const o4 = orientation(p2, q2, q1)\n\n // General case\n if (o1 !== o2 && o3 !== o4) {\n return true\n }\n\n // Special Cases\n if (o1 === 0 && onSegment(p1, p2, q1)) return true\n if (o2 === 0 && onSegment(p1, q2, q1)) return true\n if (o3 === 0 && onSegment(p2, p1, q2)) return true\n if (o4 === 0 && onSegment(p2, q1, q2)) return true\n\n return false\n}\n\n/**\n * Returns 0 if the points are colinear, 1 if they are clockwise, and 2 if they are counterclockwise.\n */\nexport function orientation(p: Point, q: Point, r: Point): number {\n const val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y)\n if (val === 0) return 0 // colinear\n return val > 0 ? 1 : 2 // clock or counterclock wise\n}\n\n/**\n * Returns true if q is on the segment p->r.\n */\nexport function onSegment(p: Point, q: Point, r: Point): boolean {\n return (\n q.x <= Math.max(p.x, r.x) &&\n q.x >= Math.min(p.x, r.x) &&\n q.y <= Math.max(p.y, r.y) &&\n q.y >= Math.min(p.y, r.y)\n )\n}\n\n/**\n * Returns the minimum distance between two segments.\n */\nfunction segmentsDistance(a1: Point, a2: Point, b1: Point, b2: Point): number {\n // Handle degenerate cases: segments of zero length\n if (a1.x === a2.x && a1.y === a2.y) {\n return pointToSegmentDistance(a1, b1, b2)\n }\n if (b1.x === b2.x && b1.y === b2.y) {\n return pointToSegmentDistance(b1, a1, a2)\n }\n\n // Check if segments intersect\n if (doSegmentsIntersect(a1, a2, b1, b2)) {\n return 0\n }\n\n // Compute the minimum distance between the segments\n const distances = [\n pointToSegmentDistance(a1, b1, b2),\n pointToSegmentDistance(a2, b1, b2),\n pointToSegmentDistance(b1, a1, a2),\n pointToSegmentDistance(b2, a1, a2),\n ]\n\n return Math.min(...distances)\n}\n\n/**\n * Returns the minimum distance between a point and a segment.\n */\nexport function pointToSegmentDistance(p: Point, v: Point, w: Point): number {\n const l2 = (w.x - v.x) ** 2 + (w.y - v.y) ** 2\n if (l2 === 0) return distance(p, v)\n\n let t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2\n t = Math.max(0, Math.min(1, t))\n\n const projection = {\n x: v.x + t * (w.x - v.x),\n y: v.y + t * (w.y - v.y),\n }\n\n return distance(p, projection)\n}\n\n/**\n * Returns the distance between two points.\n */\nexport function distance(p1: Point, p2: Point): number {\n const dx = p1.x - p2.x\n const dy = p1.y - p2.y\n return Math.sqrt(dx * dx + dy * dy)\n}\n"],"mappings":"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","names":[]}
|
package/dist/grid.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Point } from './common.js';
|
|
2
|
+
|
|
3
|
+
type GridCellPositions = {
|
|
4
|
+
index: number;
|
|
5
|
+
center: Point;
|
|
6
|
+
topLeft: Point;
|
|
7
|
+
bottomRight: Point;
|
|
8
|
+
};
|
|
9
|
+
type GridOptions = {
|
|
10
|
+
rows: number;
|
|
11
|
+
cols: number;
|
|
12
|
+
xSpacing?: number;
|
|
13
|
+
ySpacing?: number;
|
|
14
|
+
width?: number;
|
|
15
|
+
height?: number;
|
|
16
|
+
offsetX?: number;
|
|
17
|
+
offsetY?: number;
|
|
18
|
+
yDirection?: "cartesian" | "up-is-negative";
|
|
19
|
+
};
|
|
20
|
+
declare function grid({ rows, cols, xSpacing, ySpacing, width, height, offsetX, offsetY, yDirection, }: GridOptions): GridCellPositions[];
|
|
21
|
+
|
|
22
|
+
export { type GridCellPositions, type GridOptions, grid };
|
package/dist/grid.js
ADDED
package/dist/grid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export { distance, doSegmentsIntersect, doesLineIntersectLine, onSegment, orient
|
|
|
2
2
|
export { Box, BoxSet, GridCell, clamp, computeDistanceBetweenBoxes, findNearestPointsBetweenBoxSets, getBoundingBox } from './nearest-box.js';
|
|
3
3
|
export { Point } from './common.js';
|
|
4
4
|
export { getUnitVectorFromDirection, getUnitVectorFromPointAToB } from './get-unit-vector.js';
|
|
5
|
+
export { GridCellPositions, GridOptions, grid } from './grid.js';
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,9 @@ import {
|
|
|
3
3
|
getUnitVectorFromDirection,
|
|
4
4
|
getUnitVectorFromPointAToB
|
|
5
5
|
} from "./chunk-GIGMPRPV.js";
|
|
6
|
+
import {
|
|
7
|
+
grid
|
|
8
|
+
} from "./chunk-AXPIDNML.js";
|
|
6
9
|
import {
|
|
7
10
|
distance,
|
|
8
11
|
doSegmentsIntersect,
|
|
@@ -10,7 +13,7 @@ import {
|
|
|
10
13
|
onSegment,
|
|
11
14
|
orientation,
|
|
12
15
|
pointToSegmentDistance
|
|
13
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-CHQOCSFB.js";
|
|
14
17
|
import {
|
|
15
18
|
clamp,
|
|
16
19
|
computeDistanceBetweenBoxes,
|
|
@@ -27,6 +30,7 @@ export {
|
|
|
27
30
|
getBoundingBox,
|
|
28
31
|
getUnitVectorFromDirection,
|
|
29
32
|
getUnitVectorFromPointAToB,
|
|
33
|
+
grid,
|
|
30
34
|
onSegment,
|
|
31
35
|
orientation,
|
|
32
36
|
pointToSegmentDistance
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tscircuit/math-utils",
|
|
3
3
|
"main": "dist/index.js",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.6",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"build": "tsup-node src --format esm --dts --sourcemap"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@biomejs/biome": "^1.9.
|
|
29
|
+
"@biomejs/biome": "^1.9.4",
|
|
30
30
|
"@types/bun": "latest",
|
|
31
31
|
"tsup": "^8.2.4"
|
|
32
32
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/line-intersections.ts"],"sourcesContent":["import type { Point } from \"./common\";\n\n/**\n * Returns true if the two lines intersect.\n */\nexport function doesLineIntersectLine(\n\t[a1, a2]: [Point, Point],\n\t[b1, b2]: [Point, Point],\n\t{\n\t\tlineThickness = 0,\n\t}: {\n\t\tlineThickness?: number;\n\t} = {},\n): boolean {\n\tif (lineThickness === 0) {\n\t\treturn doSegmentsIntersect(a1, a2, b1, b2);\n\t}\n\tconst minDist = segmentsDistance(a1, a2, b1, b2);\n\treturn minDist <= lineThickness;\n}\n\n/**\n * Returns true if the two segments intersect.\n */\nexport function doSegmentsIntersect(\n\tp1: Point,\n\tq1: Point,\n\tp2: Point,\n\tq2: Point,\n): boolean {\n\tconst o1 = orientation(p1, q1, p2);\n\tconst o2 = orientation(p1, q1, q2);\n\tconst o3 = orientation(p2, q2, p1);\n\tconst o4 = orientation(p2, q2, q1);\n\n\t// General case\n\tif (o1 !== o2 && o3 !== o4) {\n\t\treturn true;\n\t}\n\n\t// Special Cases\n\tif (o1 === 0 && onSegment(p1, p2, q1)) return true;\n\tif (o2 === 0 && onSegment(p1, q2, q1)) return true;\n\tif (o3 === 0 && onSegment(p2, p1, q2)) return true;\n\tif (o4 === 0 && onSegment(p2, q1, q2)) return true;\n\n\treturn false;\n}\n\n/**\n * Returns 0 if the points are colinear, 1 if they are clockwise, and 2 if they are counterclockwise.\n */\nexport function orientation(p: Point, q: Point, r: Point): number {\n\tconst val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n\tif (val === 0) return 0; // colinear\n\treturn val > 0 ? 1 : 2; // clock or counterclock wise\n}\n\n/**\n * Returns true if q is on the segment p->r.\n */\nexport function onSegment(p: Point, q: Point, r: Point): boolean {\n\treturn (\n\t\tq.x <= Math.max(p.x, r.x) &&\n\t\tq.x >= Math.min(p.x, r.x) &&\n\t\tq.y <= Math.max(p.y, r.y) &&\n\t\tq.y >= Math.min(p.y, r.y)\n\t);\n}\n\n/**\n * Returns the minimum distance between two segments.\n */\nfunction segmentsDistance(a1: Point, a2: Point, b1: Point, b2: Point): number {\n\t// Handle degenerate cases: segments of zero length\n\tif (a1.x === a2.x && a1.y === a2.y) {\n\t\treturn pointToSegmentDistance(a1, b1, b2);\n\t}\n\tif (b1.x === b2.x && b1.y === b2.y) {\n\t\treturn pointToSegmentDistance(b1, a1, a2);\n\t}\n\n\t// Check if segments intersect\n\tif (doSegmentsIntersect(a1, a2, b1, b2)) {\n\t\treturn 0;\n\t}\n\n\t// Compute the minimum distance between the segments\n\tconst distances = [\n\t\tpointToSegmentDistance(a1, b1, b2),\n\t\tpointToSegmentDistance(a2, b1, b2),\n\t\tpointToSegmentDistance(b1, a1, a2),\n\t\tpointToSegmentDistance(b2, a1, a2),\n\t];\n\n\treturn Math.min(...distances);\n}\n\n/**\n * Returns the minimum distance between a point and a segment.\n */\nexport function pointToSegmentDistance(p: Point, v: Point, w: Point): number {\n\tconst l2 = (w.x - v.x) ** 2 + (w.y - v.y) ** 2;\n\tif (l2 === 0) return distance(p, v);\n\n\tlet t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n\tt = Math.max(0, Math.min(1, t));\n\n\tconst projection = {\n\t\tx: v.x + t * (w.x - v.x),\n\t\ty: v.y + t * (w.y - v.y),\n\t};\n\n\treturn distance(p, projection);\n}\n\n/**\n * Returns the distance between two points.\n */\nexport function distance(p1: Point, p2: Point): number {\n\tconst dx = p1.x - p2.x;\n\tconst dy = p1.y - p2.y;\n\treturn Math.sqrt(dx * dx + dy * dy);\n}\n"],"mappings":"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","names":[]}
|