webgl2-sdf 0.0.1 → 0.0.2
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/browser/index.min.js +1 -0
- package/node/bezier/bezier-curves-to-line-segs.js +31 -0
- package/node/bezier/bezier-curves-to-line-segs.js.map +1 -0
- package/node/bezier/eval-de-casteljau.js +61 -0
- package/node/bezier/eval-de-casteljau.js.map +1 -0
- package/node/bezier/from-to/from-to-2.js +134 -0
- package/node/bezier/from-to/from-to-2.js.map +1 -0
- package/node/bezier/from-to/from-to-3.js +159 -0
- package/node/bezier/from-to/from-to-3.js.map +1 -0
- package/node/bezier/from-to/from-to.js +21 -0
- package/node/bezier/from-to/from-to.js.map +1 -0
- package/node/bezier/is-cubic-obtuse.js +24 -0
- package/node/bezier/is-cubic-obtuse.js.map +1 -0
- package/node/bezier/is-quad-obtuse.js +20 -0
- package/node/bezier/is-quad-obtuse.js.map +1 -0
- package/node/bezier/is-really-point.js +19 -0
- package/node/bezier/is-really-point.js.map +1 -0
- package/node/bezier/split-by-deviation-from-straight-line-cubic.js +85 -0
- package/node/bezier/split-by-deviation-from-straight-line-cubic.js.map +1 -0
- package/node/bezier/split-by-deviation-from-straight-line-quad.js +50 -0
- package/node/bezier/split-by-deviation-from-straight-line-quad.js.map +1 -0
- package/node/bezier/split-into-line-segments.js +29 -0
- package/node/bezier/split-into-line-segments.js.map +1 -0
- package/node/generate-sdf.js +57 -0
- package/node/generate-sdf.js.map +1 -0
- package/node/index.js +2 -0
- package/node/index.js.map +1 -0
- package/node/main-program.js +100 -0
- package/node/main-program.js.map +1 -0
- package/node/max-aspect-ratio-before-stretch.js +3 -0
- package/node/max-aspect-ratio-before-stretch.js.map +1 -0
- package/node/prepare-buffers.js +114 -0
- package/node/prepare-buffers.js.map +1 -0
- package/node/row-count.js +4 -0
- package/node/row-count.js.map +1 -0
- package/node/shaders/main.fragment.js +149 -0
- package/node/shaders/main.fragment.js.map +1 -0
- package/node/shaders/main.vertex.js +53 -0
- package/node/shaders/main.vertex.js.map +1 -0
- package/node/svg/get-beziers-from-raw-paths.js +91 -0
- package/node/svg/get-beziers-from-raw-paths.js.map +1 -0
- package/node/svg/get-paths-from-str.js +14 -0
- package/node/svg/get-paths-from-str.js.map +1 -0
- package/node/svg/path-data-polyfill/parse-number.js +101 -0
- package/node/svg/path-data-polyfill/parse-number.js.map +1 -0
- package/node/svg/path-data-polyfill/parse-path-data-string.js +21 -0
- package/node/svg/path-data-polyfill/parse-path-data-string.js.map +1 -0
- package/node/svg/path-data-polyfill/source.js +147 -0
- package/node/svg/path-data-polyfill/source.js.map +1 -0
- package/node/svg/path-segment/c.js +29 -0
- package/node/svg/path-segment/c.js.map +1 -0
- package/node/svg/path-segment/h.js +23 -0
- package/node/svg/path-segment/h.js.map +1 -0
- package/node/svg/path-segment/l.js +24 -0
- package/node/svg/path-segment/l.js.map +1 -0
- package/node/svg/path-segment/q.js +23 -0
- package/node/svg/path-segment/q.js.map +1 -0
- package/node/svg/path-segment/s.js +34 -0
- package/node/svg/path-segment/s.js.map +1 -0
- package/node/svg/path-segment/t.js +28 -0
- package/node/svg/path-segment/t.js.map +1 -0
- package/node/svg/path-segment/v.js +23 -0
- package/node/svg/path-segment/v.js.map +1 -0
- package/node/svg/path-segment/z.js +21 -0
- package/node/svg/path-segment/z.js.map +1 -0
- package/node/svg/path-state.js +2 -0
- package/node/svg/path-state.js.map +1 -0
- package/node/tex-width.js +12 -0
- package/node/tex-width.js.map +1 -0
- package/node/types/attribute.js +2 -0
- package/node/types/attribute.js.map +1 -0
- package/node/types/cell.js +2 -0
- package/node/types/cell.js.map +1 -0
- package/node/types/gl-context.js +2 -0
- package/node/types/gl-context.js.map +1 -0
- package/node/types/gl-type.js +2 -0
- package/node/types/gl-type.js.map +1 -0
- package/node/types/gl-usage.js +2 -0
- package/node/types/gl-usage.js.map +1 -0
- package/node/types/program.js +2 -0
- package/node/types/program.js.map +1 -0
- package/node/types/strip.js +2 -0
- package/node/types/strip.js.map +1 -0
- package/node/types/texture.js +2 -0
- package/node/types/texture.js.map +1 -0
- package/node/utils/calc-circs.js +97 -0
- package/node/utils/calc-circs.js.map +1 -0
- package/node/utils/clip-line-segment-to-grid.js +98 -0
- package/node/utils/clip-line-segment-to-grid.js.map +1 -0
- package/node/utils/clip-line-segment-to-strips.js +150 -0
- package/node/utils/clip-line-segment-to-strips.js.map +1 -0
- package/node/utils/create-empty-grid.js +24 -0
- package/node/utils/create-empty-grid.js.map +1 -0
- package/node/utils/create-empty-strips.js +16 -0
- package/node/utils/create-empty-strips.js.map +1 -0
- package/node/utils/distance-seg-to-p.js +35 -0
- package/node/utils/distance-seg-to-p.js.map +1 -0
- package/node/utils/find-close-cells.js +130 -0
- package/node/utils/find-close-cells.js.map +1 -0
- package/node/utils/find-crossing-cells.js +31 -0
- package/node/utils/find-crossing-cells.js.map +1 -0
- package/node/utils/get-distance-to-line-function.js +45 -0
- package/node/utils/get-distance-to-line-function.js.map +1 -0
- package/node/utils/jump-idx.js +81 -0
- package/node/utils/jump-idx.js.map +1 -0
- package/node/utils/map-to-viewbox.js +29 -0
- package/node/utils/map-to-viewbox.js.map +1 -0
- package/node/utils/seg-box-x.js +69 -0
- package/node/utils/seg-box-x.js.map +1 -0
- package/node/utils/seg-strip-x.js +58 -0
- package/node/utils/seg-strip-x.js.map +1 -0
- package/node/vector/dot.js +11 -0
- package/node/vector/dot.js.map +1 -0
- package/node/vector/from-to-vec.js +11 -0
- package/node/vector/from-to-vec.js.map +1 -0
- package/node/vector/len.js +9 -0
- package/node/vector/len.js.map +1 -0
- package/node/webgl-utils/compile-shader.js +8 -0
- package/node/webgl-utils/compile-shader.js.map +1 -0
- package/node/webgl-utils/get-gl-context.js +43 -0
- package/node/webgl-utils/get-gl-context.js.map +1 -0
- package/node/webgl-utils/set-attribute.js +52 -0
- package/node/webgl-utils/set-attribute.js.map +1 -0
- package/node/webgl-utils/set-uniform-block.js +31 -0
- package/node/webgl-utils/set-uniform-block.js.map +1 -0
- package/node/webgl-utils/set-uniform.js +11 -0
- package/node/webgl-utils/set-uniform.js.map +1 -0
- package/node/webgl-utils/uniform-block.js +2 -0
- package/node/webgl-utils/uniform-block.js.map +1 -0
- package/node/webgl-utils/uniform-type.js +2 -0
- package/node/webgl-utils/uniform-type.js.map +1 -0
- package/node/webgl-utils/use-program.js +31 -0
- package/node/webgl-utils/use-program.js.map +1 -0
- package/node/webgl-utils/use-texture.js +25 -0
- package/node/webgl-utils/use-texture.js.map +1 -0
- package/package.json +4 -5
- package/node/debug-shaders.d.ts +0 -9
- package/node/helpers/calc-circs.d.ts +0 -11
- package/node/helpers/clip-line-segment-to-grid.d.ts +0 -14
- package/node/helpers/clip-line-segment-to-strips.d.ts +0 -13
- package/node/helpers/create-empty-grid.d.ts +0 -8
- package/node/helpers/create-empty-strips.d.ts +0 -7
- package/node/helpers/distance-seg-to-p.d.ts +0 -5
- package/node/helpers/find-close-cells.d.ts +0 -3
- package/node/helpers/find-crossing-cells.d.ts +0 -3
- package/node/helpers/get-distance-to-line-function.d.ts +0 -10
- package/node/helpers/jump-idx.d.ts +0 -2
- package/node/helpers/map-to-viewbox.d.ts +0 -2
- package/node/helpers/seg-box-x.d.ts +0 -10
- package/node/helpers/seg-strip-x.d.ts +0 -9
- package/node/webgl2.d.ts +0 -2
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { segStripX } from "./seg-strip-x";
|
|
2
|
+
const { floor, ceil } = Math;
|
|
3
|
+
/**
|
|
4
|
+
* Clips a line segment to strip boundaries and returns multiple segments.
|
|
5
|
+
*
|
|
6
|
+
* * modifies strips by adding line segments to each strip
|
|
7
|
+
* * size/count *must* be a power of 2
|
|
8
|
+
*
|
|
9
|
+
* @param count the number of strips
|
|
10
|
+
* @param height the height of a strip
|
|
11
|
+
* @param seg the line segment (array of 2 points)
|
|
12
|
+
*/
|
|
13
|
+
function clipLineSegmentToStrips(strips, height, seg) {
|
|
14
|
+
const count = strips.length;
|
|
15
|
+
/** `cellSize` *must* be a power of two */
|
|
16
|
+
const cellSize = height / count;
|
|
17
|
+
const [p0, p1] = seg;
|
|
18
|
+
const ps = segStripX(seg, [0, 0, height]);
|
|
19
|
+
const [x0, y0] = p0;
|
|
20
|
+
const [x1, y1] = p1;
|
|
21
|
+
const dX = x1 - x0;
|
|
22
|
+
const dY = y1 - y0;
|
|
23
|
+
const p0IsInStrip = x0 < 0 && y0 > 0 && y0 < height;
|
|
24
|
+
const p1IsInStrip = x1 < 0 && y1 > 0 && y1 < height;
|
|
25
|
+
// if line is completely outside strip
|
|
26
|
+
if ((ps.length < 2 && !p0IsInStrip && !p1IsInStrip) &&
|
|
27
|
+
((x0 !== 0 || dX !== 0) ||
|
|
28
|
+
((y0 <= 0 && y1 <= 0) || (y0 >= height && y1 >= height)))) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Determine which strips the line passes through
|
|
32
|
+
if (dY === 0) { // no crossings possible
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Use Bresenham-like approach to find all strips the line crosses
|
|
36
|
+
const stepY = y1 > y0 ? cellSize : -cellSize;
|
|
37
|
+
/** first point of each line segment to connect */
|
|
38
|
+
/** current x position */
|
|
39
|
+
let x = x0;
|
|
40
|
+
/** current y position */
|
|
41
|
+
let y = y0;
|
|
42
|
+
let i = 0;
|
|
43
|
+
// left-to-right
|
|
44
|
+
const ltr = x1 > x0;
|
|
45
|
+
// bottom-to-top
|
|
46
|
+
const btt = y1 > y0;
|
|
47
|
+
// // line segment min-y excluded
|
|
48
|
+
// const crossing =
|
|
49
|
+
// (seg.y > y != seg.w > y) &&
|
|
50
|
+
// (x > (seg.z - seg.x)*(y - seg.y) / (seg.w - seg.y) + seg.x);
|
|
51
|
+
const fY = btt ? floor : ceil;
|
|
52
|
+
while (true) {
|
|
53
|
+
// Find next strip boundary
|
|
54
|
+
let nextGridX = ((ltr && x < 0) || (!ltr && x > 0)) ? 0 : Number.NEGATIVE_INFINITY;
|
|
55
|
+
let nextGridY = cellSize * fY((y + stepY) / cellSize);
|
|
56
|
+
// Calculate parameter t for intersection with horizontal strip lines
|
|
57
|
+
// eq. (1)
|
|
58
|
+
const tX = (nextGridX - x0) / dX;
|
|
59
|
+
// eq. (2)
|
|
60
|
+
const tY = (nextGridY - y0) / dY;
|
|
61
|
+
const useTx = tX < tY && dX !== 0;
|
|
62
|
+
/** intersection X */
|
|
63
|
+
const xX = useTx ? 0 : x0 + tY * dX;
|
|
64
|
+
/** intersection Y */
|
|
65
|
+
const xY = useTx ? y0 + tX * dY : nextGridY;
|
|
66
|
+
// if we're past the line endpoint
|
|
67
|
+
if ((tX > 1 || dX === 0) && tY > 1) {
|
|
68
|
+
const v = floor(p1[1] / cellSize);
|
|
69
|
+
strips[v]?.lineSegs.push([[x, y], p1]);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
if (((xX >= 0 && (x0 !== 0 || dX !== 0)) || xY <= 0 || xY >= height)) {
|
|
73
|
+
// next strip intersection is on edge of strips
|
|
74
|
+
const entering = !p0IsInStrip && i === 0;
|
|
75
|
+
if (entering) {
|
|
76
|
+
// update current x,y position
|
|
77
|
+
[x, y] = ps[0];
|
|
78
|
+
i++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const v = fY(y / cellSize) - (btt ? 0 : 1); // previous v
|
|
83
|
+
const seg_ = [[x, y], ps[i]];
|
|
84
|
+
strips[v]?.lineSegs.push(seg_);
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// previous v
|
|
89
|
+
const v = fY(y / cellSize) - (btt ? 0 : 1);
|
|
90
|
+
strips[v]?.lineSegs.push([[x, y], [xX, xY]]);
|
|
91
|
+
// update current position
|
|
92
|
+
x = xX;
|
|
93
|
+
y = xY;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export { clipLineSegmentToStrips };
|
|
97
|
+
// Quokka tests - https://www.desmos.com/calculator/uyqsdkviih
|
|
98
|
+
// import { createEmptyStrips } from "./create-empty-strips";
|
|
99
|
+
// {
|
|
100
|
+
// const strips = createEmptyStrips(8);
|
|
101
|
+
// const seg = [[0, 100], [0, 400]];
|
|
102
|
+
// toDesmosStr(seg);
|
|
103
|
+
// clipLineSegmentToStrips(strips, 512, seg);
|
|
104
|
+
// testAllEmptyExcept(strips,[1,2,3,4,5,6]);
|
|
105
|
+
// }
|
|
106
|
+
// {
|
|
107
|
+
// const strips = createEmptyStrips(8);
|
|
108
|
+
// const seg = [[83, 166], [-90, 440]];
|
|
109
|
+
// toDesmosStr(seg);
|
|
110
|
+
// clipLineSegmentToStrips(strips, 512, seg);
|
|
111
|
+
// testAllEmptyExcept(strips,[4,5,6]);
|
|
112
|
+
// }
|
|
113
|
+
// {
|
|
114
|
+
// const strips = createEmptyStrips(8);
|
|
115
|
+
// const seg = [[-570, 236], [-392, 546]];
|
|
116
|
+
// toDesmosStr(seg);
|
|
117
|
+
// clipLineSegmentToStrips(strips, 512, seg);
|
|
118
|
+
// testAllEmptyExcept(strips,[3,4,5,6,7]);
|
|
119
|
+
// }
|
|
120
|
+
// {
|
|
121
|
+
// const strips = createEmptyStrips(8);
|
|
122
|
+
// const seg = [[-462, 632], [-152, 611]];
|
|
123
|
+
// toDesmosStr(seg);
|
|
124
|
+
// clipLineSegmentToStrips(strips, 512, seg);
|
|
125
|
+
// testAllEmptyExcept(strips,[]);
|
|
126
|
+
// }
|
|
127
|
+
// function toDesmosStr(seg: number[][]) {
|
|
128
|
+
// const [[x0,y0],[x1,y1]] = seg;
|
|
129
|
+
// return `\\left(\\left(1-t\\right)\\cdot${x0.toFixed(2)}+t\\cdot\\left(${x1.toFixed(2)}\\right),\\left(1-t\\right)\\cdot${y0.toFixed(2)}+t\\cdot${y1.toFixed(2)}\\right)`;
|
|
130
|
+
// }
|
|
131
|
+
// function testAllEmptyExcept(
|
|
132
|
+
// strips: Strip[],
|
|
133
|
+
// exceptions: number[]) {
|
|
134
|
+
// for (let i=0; i<strips.length; i++) {
|
|
135
|
+
// const strip = strips[i];
|
|
136
|
+
// const idx = exceptions.findIndex(v => v === i);
|
|
137
|
+
// const exception = exceptions[idx];
|
|
138
|
+
// const len = strip.lineSegs.length;
|
|
139
|
+
// if (exception === undefined) {
|
|
140
|
+
// if (len !== 0) {
|
|
141
|
+
// throw new Error(`Strip ${i} must be empty`);
|
|
142
|
+
// }
|
|
143
|
+
// } else {
|
|
144
|
+
// if (len !== 1) {
|
|
145
|
+
// throw new Error(`Strip ${i} must contain 1 segments, found ${len}`);
|
|
146
|
+
// }
|
|
147
|
+
// }
|
|
148
|
+
// }
|
|
149
|
+
// }
|
|
150
|
+
//# sourceMappingURL=clip-line-segment-to-strips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clip-line-segment-to-strips.js","sourceRoot":"","sources":["../../src/utils/clip-line-segment-to-strips.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ROW_COUNT } from "../row-count";
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param colCount
|
|
5
|
+
* @param padCount
|
|
6
|
+
*/
|
|
7
|
+
function createEmptyGrid(colCount, padCount) {
|
|
8
|
+
const grid = [];
|
|
9
|
+
// for (let u=0; u<ROW_COUNT + 2*padCount; u++) {
|
|
10
|
+
for (let u = 0; u < colCount + 2 * padCount; u++) {
|
|
11
|
+
const cells = [];
|
|
12
|
+
for (let v = 0; v < ROW_COUNT + 2 * padCount; v++) {
|
|
13
|
+
cells.push({
|
|
14
|
+
lineSegs: [],
|
|
15
|
+
closeCells: [],
|
|
16
|
+
crossingCells: []
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
grid.push(cells);
|
|
20
|
+
}
|
|
21
|
+
return grid;
|
|
22
|
+
}
|
|
23
|
+
export { createEmptyGrid };
|
|
24
|
+
//# sourceMappingURL=create-empty-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-empty-grid.js","sourceRoot":"","sources":["../../src/utils/create-empty-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC;;;;GAIG;AACH,SAAS,eAAe,CAChB,QAAgB,EAChB,QAAgB;IAEpB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,iDAAiD;IACjD,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,QAAQ,GAAG,CAAC,GAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC;gBACP,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,EAAE;gBACd,aAAa,EAAE,EAAE;aACpB,CAAC,CAAC;QACP,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ROW_COUNT } from "../row-count";
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param count the number of strips
|
|
5
|
+
*/
|
|
6
|
+
// TODO - remove
|
|
7
|
+
function createEmptyStrips() {
|
|
8
|
+
const strips = [];
|
|
9
|
+
for (let v = 0; v < ROW_COUNT; v++) {
|
|
10
|
+
// TODO - simplify
|
|
11
|
+
strips.push({ lineSegs: [] });
|
|
12
|
+
}
|
|
13
|
+
return strips;
|
|
14
|
+
}
|
|
15
|
+
export { createEmptyStrips };
|
|
16
|
+
//# sourceMappingURL=create-empty-strips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-empty-strips.js","sourceRoot":"","sources":["../../src/utils/create-empty-strips.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC;;;GAGG;AACH,gBAAgB;AAChB,SAAS,iBAAiB;IACtB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,kBAAkB;QAClB,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAGD,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const { min, max, sqrt } = Math;
|
|
2
|
+
/**
|
|
3
|
+
* Returns the minimum distance from the given line segment to the origin.
|
|
4
|
+
*/
|
|
5
|
+
function distanceSegToP(seg, p) {
|
|
6
|
+
const seg0 = seg[0];
|
|
7
|
+
const seg1 = seg[1];
|
|
8
|
+
const _x1 = seg0[0];
|
|
9
|
+
const _y1 = seg0[1];
|
|
10
|
+
const _x2 = seg1[0];
|
|
11
|
+
const _y2 = seg1[1];
|
|
12
|
+
const x = p[0];
|
|
13
|
+
const y = p[1];
|
|
14
|
+
const x1 = _x1 - x;
|
|
15
|
+
const y1 = _y1 - y;
|
|
16
|
+
const x2 = _x2 - x;
|
|
17
|
+
const y2 = _y2 - y;
|
|
18
|
+
// Vector from point 1 to point 2
|
|
19
|
+
const dx = x2 - x1;
|
|
20
|
+
const dy = y2 - y1;
|
|
21
|
+
const lengthSq = dx * dx + dy * dy;
|
|
22
|
+
// Calculate projection parameter t
|
|
23
|
+
// t represents where the closest point lies on the line segment
|
|
24
|
+
// t = 0 means closest point is at seg[0], t = 1 means closest point is at seg[1]
|
|
25
|
+
const t = max(0, min(1, -(x1 * dx + y1 * dy) / lengthSq));
|
|
26
|
+
// Find the closest point on the segment
|
|
27
|
+
const closestX = x1 + t * dx;
|
|
28
|
+
const closestY = y1 + t * dy;
|
|
29
|
+
// Return distance from origin to closest point
|
|
30
|
+
return sqrt(closestX * closestX + closestY * closestY);
|
|
31
|
+
}
|
|
32
|
+
export { distanceSegToP };
|
|
33
|
+
// Quokka tests
|
|
34
|
+
// distanceSegToOrigin([[0,1],[-1,-2]]);//?
|
|
35
|
+
//# sourceMappingURL=distance-seg-to-p.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distance-seg-to-p.js","sourceRoot":"","sources":["../../src/utils/distance-seg-to-p.ts"],"names":[],"mappings":"AACA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAGhC;;GAEG;AACH,SAAS,cAAc,CACf,GAAe,EACf,CAAW;IAEf,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACf,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEf,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;IAEnB,iCAAiC;IACjC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAEnB,MAAM,QAAQ,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;IAE/B,mCAAmC;IACnC,gEAAgE;IAChE,iFAAiF;IACjF,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAEtD,wCAAwC;IACxC,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,GAAC,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,EAAE,GAAG,CAAC,GAAC,EAAE,CAAC;IAE3B,+CAA+C;IAC/C,OAAO,IAAI,CAAC,QAAQ,GAAC,QAAQ,GAAG,QAAQ,GAAC,QAAQ,CAAC,CAAC;AACvD,CAAC;AAGD,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,eAAe;AACf,2CAA2C"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { ROW_COUNT } from "../row-count";
|
|
2
|
+
import { circsCache } from "./calc-circs";
|
|
3
|
+
import { distanceSegToP } from "./distance-seg-to-p";
|
|
4
|
+
import { jumpIdx } from "./jump-idx";
|
|
5
|
+
const { min, SQRT2 } = Math;
|
|
6
|
+
function findCloseCells(grid, colCount, cellSize, maxDistance, padCount) {
|
|
7
|
+
const findCloseCellsFor_ = findCloseCellsFor(grid, colCount, cellSize, maxDistance, padCount);
|
|
8
|
+
let _minD = 0; // minimum for previous row, col 0
|
|
9
|
+
let minD = 0;
|
|
10
|
+
for (let i = padCount; i < colCount + padCount; i++) {
|
|
11
|
+
minD = _minD;
|
|
12
|
+
for (let j = padCount; j < ROW_COUNT + padCount; j++) {
|
|
13
|
+
minD = findCloseCellsFor_(i, j, minD);
|
|
14
|
+
if (j === padCount) {
|
|
15
|
+
_minD = minD;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function findCloseCellsFor(grid, colCount, cellSize, maxDistance, padCount) {
|
|
21
|
+
return function findCloseCellsFor_(i, j, _minD) {
|
|
22
|
+
// reduce current circle search range since we moved one square
|
|
23
|
+
let k = jumpIdx((_minD - SQRT2 * cellSize) / cellSize);
|
|
24
|
+
let minD = Number.POSITIVE_INFINITY;
|
|
25
|
+
while (k < circsCache.length) {
|
|
26
|
+
const from = circsCache[k].from;
|
|
27
|
+
// `SQRT2` to account for diagonal
|
|
28
|
+
if (cellSize * from > maxDistance + SQRT2 * cellSize) {
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
// uncomment loop below to search all equidistant squares
|
|
32
|
+
// while (circsCache?.[k].from === from) {
|
|
33
|
+
const { u, v } = circsCache[k];
|
|
34
|
+
const u_ = u + i;
|
|
35
|
+
const v_ = v + j;
|
|
36
|
+
if (u_ < 0 || u_ >= colCount + 2 * padCount ||
|
|
37
|
+
v_ < 0 || v_ >= ROW_COUNT + 2 * padCount) {
|
|
38
|
+
k++;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const { lineSegs } = grid[u_][v_];
|
|
42
|
+
for (let l = 0; l < lineSegs.length; l++) {
|
|
43
|
+
// center of square
|
|
44
|
+
const c = [(i - padCount + 0.5) * cellSize, (j - padCount + 0.5) * cellSize];
|
|
45
|
+
const d = distanceSegToP(lineSegs[l], c);
|
|
46
|
+
if (d < minD) {
|
|
47
|
+
minD = d;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
k++;
|
|
51
|
+
// }
|
|
52
|
+
if (minD !== Number.POSITIVE_INFINITY) {
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (minD === Number.POSITIVE_INFINITY) {
|
|
57
|
+
return min(maxDistance + SQRT2 * cellSize, cellSize * circsCache[circsCache.length - 1].from);
|
|
58
|
+
}
|
|
59
|
+
const { closeCells } = grid[i][j];
|
|
60
|
+
let l = jumpIdx((_minD - 2 * SQRT2 * cellSize) / cellSize);
|
|
61
|
+
while (l < circsCache.length) {
|
|
62
|
+
const { from, u, v } = circsCache[l];
|
|
63
|
+
// `SQRT2` to account for diagonal
|
|
64
|
+
if (cellSize * from > min(minD, maxDistance) + SQRT2 * cellSize) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
const u_ = u + i;
|
|
68
|
+
const v_ = v + j;
|
|
69
|
+
if (u_ < 0 || u_ >= colCount + 2 * padCount ||
|
|
70
|
+
v_ < 0 || v_ >= ROW_COUNT + 2 * padCount) {
|
|
71
|
+
l++;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const { lineSegs } = grid[u_][v_];
|
|
75
|
+
if (lineSegs.length > 0) {
|
|
76
|
+
closeCells.push((2 * padCount + ROW_COUNT) * u_ + v_);
|
|
77
|
+
}
|
|
78
|
+
l++;
|
|
79
|
+
}
|
|
80
|
+
return minD;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export { findCloseCells };
|
|
84
|
+
// Quokka tests
|
|
85
|
+
// const grid: Cell[][] = [
|
|
86
|
+
// [
|
|
87
|
+
// { u: 0, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
88
|
+
// { u: 0, v: 1, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
89
|
+
// { u: 0, v: 2, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
90
|
+
// { u: 0, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
91
|
+
// ],
|
|
92
|
+
// [
|
|
93
|
+
// { u: 1, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
94
|
+
// {
|
|
95
|
+
// u: 1, v: 1,
|
|
96
|
+
// lineSegs: [[[175, 163], [175, 355]]],
|
|
97
|
+
// closeCells: [], crossingCells: []
|
|
98
|
+
// },
|
|
99
|
+
// {
|
|
100
|
+
// u: 1, v: 2,
|
|
101
|
+
// lineSegs: [[[175, 355], [335, 355]]],
|
|
102
|
+
// closeCells: [], crossingCells: []
|
|
103
|
+
// },
|
|
104
|
+
// { u: 1, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
105
|
+
// ],
|
|
106
|
+
// [
|
|
107
|
+
// { u: 2, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
108
|
+
// {
|
|
109
|
+
// u: 2, v: 1,
|
|
110
|
+
// lineSegs: [[[335, 163], [175, 163]]],
|
|
111
|
+
// closeCells: [], crossingCells: []
|
|
112
|
+
// },
|
|
113
|
+
// {
|
|
114
|
+
// u: 2, v: 2,
|
|
115
|
+
// lineSegs: [[[335, 355], [335, 163]]],
|
|
116
|
+
// closeCells: [], crossingCells: []
|
|
117
|
+
// },
|
|
118
|
+
// { u: 2, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
119
|
+
// ],
|
|
120
|
+
// [
|
|
121
|
+
// { u: 3, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
122
|
+
// { u: 3, v: 1, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
123
|
+
// { u: 3, v: 2, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
124
|
+
// { u: 3, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
125
|
+
// ]
|
|
126
|
+
// ];
|
|
127
|
+
// findCloseCells(grid);
|
|
128
|
+
// const v = grid.map(cells => cells.map(c => ({ u: c.u, v: c.v, closeCells: c.closeCells })));
|
|
129
|
+
// v;//?
|
|
130
|
+
//# sourceMappingURL=find-close-cells.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-close-cells.js","sourceRoot":"","sources":["../../src/utils/find-close-cells.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ROW_COUNT } from "../row-count";
|
|
2
|
+
// TODO - simplify?
|
|
3
|
+
// TODO - could be made much faster by also checking intersections here
|
|
4
|
+
// and passing the result to the next cell
|
|
5
|
+
function findCrossingCells(grid, colCount, padCount) {
|
|
6
|
+
for (let i = padCount; i < colCount + padCount; i++) {
|
|
7
|
+
for (let j = padCount; j < ROW_COUNT + padCount; j++) {
|
|
8
|
+
const cc = grid[i][j].crossingCells;
|
|
9
|
+
for (let k = padCount; k <= i; k++) {
|
|
10
|
+
if (grid[k][j].lineSegs.length === 0) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
cc.push((ROW_COUNT + 2 * padCount) * k + j);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export { findCrossingCells };
|
|
19
|
+
// Quokka tests
|
|
20
|
+
// import { createEmptyGrid } from "./create-empty-grid";
|
|
21
|
+
// // const g = createEmptyGrid(0);
|
|
22
|
+
// const g = createEmptyGrid(0);
|
|
23
|
+
// // g[0][0].lineSegs.push([[]]);
|
|
24
|
+
// g[2][0].lineSegs.push([[]]);
|
|
25
|
+
// g[2][2].lineSegs.push([[]]);
|
|
26
|
+
// findCrossingCells(g);
|
|
27
|
+
// let r = 2;
|
|
28
|
+
// // g.map(r => r.map(c => c.crossingCells))[r].map(v => v);//?
|
|
29
|
+
// g.map(r => r.map(c => c.crossingCells))[r].map(v => v.map(r => r[1]));//?
|
|
30
|
+
// g;//?
|
|
31
|
+
//# sourceMappingURL=find-crossing-cells.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-crossing-cells.js","sourceRoot":"","sources":["../../src/utils/find-crossing-cells.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,mBAAmB;AACnB,uEAAuE;AACvE,0CAA0C;AAC1C,SAAS,iBAAiB,CAClB,IAAc,EACd,QAAgB,EAChB,QAAgB;IAEpB,KAAK,IAAI,CAAC,GAAC,QAAQ,EAAE,CAAC,GAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAC,QAAQ,EAAE,CAAC,GAAC,SAAS,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAEpC,KAAK,IAAI,CAAC,GAAC,QAAQ,EAAE,CAAC,IAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACnD,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,iBAAiB,EAAE,CAAA;AAG5B,eAAe;AACf,yDAAyD;AACzD,mCAAmC;AACnC,gCAAgC;AAChC,kCAAkC;AAClC,+BAA+B;AAC/B,+BAA+B;AAC/B,wBAAwB;AACxB,aAAa;AACb,gEAAgE;AAChE,4EAA4E;AAC5E,QAAQ"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const { sqrt } = Math;
|
|
2
|
+
/**
|
|
3
|
+
* Returns a function that returns the signed distance to the given line from
|
|
4
|
+
* the given point.
|
|
5
|
+
*
|
|
6
|
+
* @param pS a point on the line
|
|
7
|
+
* @param pE a different point on the line; if `pS` is the same as `pE` then
|
|
8
|
+
* the distance to the point `pS` (or `pE`) will be returned.
|
|
9
|
+
*/
|
|
10
|
+
function getDistanceToLineFunction(pS, pE) {
|
|
11
|
+
const xS = pS[0];
|
|
12
|
+
const yS = pS[1];
|
|
13
|
+
const xE = pE[0];
|
|
14
|
+
const yE = pE[1];
|
|
15
|
+
const s = yS - yE;
|
|
16
|
+
const t = xE - xS;
|
|
17
|
+
const v = xS * yE - xE * yS;
|
|
18
|
+
// Calculate the length of the line for normalization
|
|
19
|
+
const lineLength = sqrt(s * s + t * t);
|
|
20
|
+
return function (p) {
|
|
21
|
+
const x = p[0];
|
|
22
|
+
const y = p[1];
|
|
23
|
+
// Calculate the perpendicular distance from point to line
|
|
24
|
+
return lineLength !== 0
|
|
25
|
+
? (s * x + t * y + v) / lineLength
|
|
26
|
+
: sqrt((x - xS) ** 2 + (y - yS) ** 2);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export { getDistanceToLineFunction };
|
|
30
|
+
// Quokka tests
|
|
31
|
+
{
|
|
32
|
+
const pS = [6, 2];
|
|
33
|
+
const pE = [6, 2];
|
|
34
|
+
const p = [10, 1];
|
|
35
|
+
const f = getDistanceToLineFunction(pS, pE);
|
|
36
|
+
f(p); //?
|
|
37
|
+
}
|
|
38
|
+
// {
|
|
39
|
+
// const p0 = [0,0];
|
|
40
|
+
// const p1 = [6,1];
|
|
41
|
+
// const p2 = [10,1];
|
|
42
|
+
// const f = getDistanceToLineFunction(p0,p2);
|
|
43
|
+
// f(p1);//?
|
|
44
|
+
// }
|
|
45
|
+
//# sourceMappingURL=get-distance-to-line-function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-distance-to-line-function.js","sourceRoot":"","sources":["../../src/utils/get-distance-to-line-function.ts"],"names":[],"mappings":"AACA,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAGtB;;;;;;;GAOG;AACH,SAAS,yBAAyB,CAChC,EAAY,EACZ,EAAY;IAEb,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;IAExB,qDAAqD;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,CAAC,CAAC,CAAC;IAEnC,OAAO,UAAS,CAAW;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEf,0DAA0D;QAC1D,OAAO,UAAU,KAAK,CAAC;YACb,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU;YAC9B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,IAAE,CAAC,CAAC,CACpC;IACR,CAAC,CAAA;AACF,CAAC;AAGD,OAAO,EAAE,yBAAyB,EAAE,CAAA;AAGpC,eAAe;AACf,CAAC;IACG,MAAM,EAAE,GAAG,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAC,CAAC,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,yBAAyB,CAAC,EAAE,EAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,GAAG;AACZ,CAAC;AACD,IAAI;AACJ,wBAAwB;AACxB,wBAAwB;AACxB,yBAAyB;AACzB,kDAAkD;AAClD,gBAAgB;AAChB,IAAI"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { circsCache } from "./calc-circs";
|
|
2
|
+
const { trunc, max, E } = Math;
|
|
3
|
+
/**
|
|
4
|
+
* @param v
|
|
5
|
+
*/
|
|
6
|
+
function binarySearchRange(v) {
|
|
7
|
+
let min = 0;
|
|
8
|
+
let max = circsCache.length - 1;
|
|
9
|
+
let mid = 0;
|
|
10
|
+
while (min <= max) {
|
|
11
|
+
mid = (min + max) >>> 1; //?
|
|
12
|
+
const midVal = circsCache[mid].from;
|
|
13
|
+
if (midVal === v) {
|
|
14
|
+
// return [min,mid,max];
|
|
15
|
+
return mid;
|
|
16
|
+
}
|
|
17
|
+
else if (v > midVal) {
|
|
18
|
+
min = mid + 1;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
max = mid - 1;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// return [min,mid,max];
|
|
25
|
+
return mid;
|
|
26
|
+
}
|
|
27
|
+
// const [Q,R] = [10.606601717798213, 35.531676008879735];
|
|
28
|
+
// const [A1,B1,F1] = [102.42126, 0.153169, -117.56077];
|
|
29
|
+
// const [A2,B2,C2,D2,F2] = [-0.000660087, 0.388148, 841.25744, -0.0529616, -1089.49916];
|
|
30
|
+
// const [A3,B3,C3,D3,F3] = [-7567711.63, -0.0251756, 7562560.69, 0.025054, -7475.16953];
|
|
31
|
+
// function jumpIdxOld(
|
|
32
|
+
// c: number) {
|
|
33
|
+
// let idx = trunc(
|
|
34
|
+
// c <= 0 ? 0 : c <= 0.7071067811865476 ? 1 : c <= 1.5 ? 5
|
|
35
|
+
// // Three-part regression (faster than binary search in this case)
|
|
36
|
+
// : (c <= Q)
|
|
37
|
+
// ? A1*(E**(B1*c)) + F1
|
|
38
|
+
// : c <= R
|
|
39
|
+
// ? A2*(E**(B2*c)) + C2*(E**(-D2*c)) + F2
|
|
40
|
+
// : A3*(E**(B3*c)) + C3*(E**(-D3*c)) + F3);
|
|
41
|
+
// c = max(0, c);
|
|
42
|
+
// while (circsCache[idx].from > c) { idx--; }
|
|
43
|
+
// while (circsCache[idx + 1].from < c) { idx++; }
|
|
44
|
+
// return idx;
|
|
45
|
+
// }
|
|
46
|
+
function jumpIdx(c) {
|
|
47
|
+
let idx = binarySearchRange(c);
|
|
48
|
+
c = max(0, c);
|
|
49
|
+
while (idx !== 0 && circsCache[idx].from >= c) {
|
|
50
|
+
idx--;
|
|
51
|
+
}
|
|
52
|
+
while (idx < circsCache.length - 2 && circsCache[idx + 1].from < c) {
|
|
53
|
+
idx++;
|
|
54
|
+
}
|
|
55
|
+
return idx;
|
|
56
|
+
}
|
|
57
|
+
export { jumpIdx };
|
|
58
|
+
// Quokka tests
|
|
59
|
+
// // circsCache.slice(0,30).map(c => c.from);//?
|
|
60
|
+
// circsCache[12].from;//?
|
|
61
|
+
// circsCache[15].from;//?
|
|
62
|
+
// // circsCache.length;//?
|
|
63
|
+
// // jumpIdxOld(1.5811388300841898);//?
|
|
64
|
+
// jumpIdx(0.5);//?
|
|
65
|
+
// binarySearchRange(1.5811388300841898);//?
|
|
66
|
+
// jumpIdxOld(3.7);//?
|
|
67
|
+
// jumpIdx(3.7);//?
|
|
68
|
+
// // binarySearchRange(3.7);//?
|
|
69
|
+
// jumpIdxOld(0);//?
|
|
70
|
+
// jumpIdx(0);//?
|
|
71
|
+
// // binarySearchRange(0);//?
|
|
72
|
+
// jumpIdxOld(13.7);//?
|
|
73
|
+
// jumpIdx(13.7);//?
|
|
74
|
+
// // binarySearchRange(13.7);//?
|
|
75
|
+
// jumpIdxOld(33.7);//?
|
|
76
|
+
// jumpIdx(33.7);//?
|
|
77
|
+
// // binarySearchRange(33.7);//?
|
|
78
|
+
// // jumpIdxOld(55);//?
|
|
79
|
+
// // jumpIdx(55);//?
|
|
80
|
+
// binarySearchRange(55);//?
|
|
81
|
+
//# sourceMappingURL=jump-idx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jump-idx.js","sourceRoot":"","sources":["../../src/utils/jump-idx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;AAG/B;;GAEG;AACH,SAAS,iBAAiB,CAClB,CAAS;IAEb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAEhC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAChB,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA,GAAG;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACpC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACf,wBAAwB;YACxB,OAAO,GAAG,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;YACpB,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACJ,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,OAAO,GAAG,CAAC;AACf,CAAC;AAGD,0DAA0D;AAC1D,wDAAwD;AACxD,yFAAyF;AACzF,yFAAyF;AACzF,uBAAuB;AACvB,uBAAuB;AAEvB,uBAAuB;AACvB,kEAAkE;AAClE,4EAA4E;AAC5E,sBAAsB;AACtB,gCAAgC;AAChC,mBAAmB;AACnB,kDAAkD;AAClD,oDAAoD;AAEpD,qBAAqB;AACrB,kDAAkD;AAClD,sDAAsD;AAEtD,kBAAkB;AAClB,IAAI;AAGJ,SAAS,OAAO,CACR,CAAS;IAEb,IAAI,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAE/B,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACd,OAAO,GAAG,KAAK,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QAAC,GAAG,EAAE,CAAC;IAAC,CAAC;IACzD,OAAO,GAAG,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAAC,GAAG,EAAE,CAAC;IAAC,CAAC;IAE9E,OAAO,GAAG,CAAC;AACf,CAAC;AAGD,OAAO,EAAE,OAAO,EAAE,CAAA;AAGlB,eAAe;AACf,iDAAiD;AACjD,0BAA0B;AAC1B,0BAA0B;AAC1B,2BAA2B;AAE3B,wCAAwC;AACxC,mBAAmB;AACnB,4CAA4C;AAG5C,sBAAsB;AACtB,mBAAmB;AACnB,gCAAgC;AAEhC,oBAAoB;AACpB,iBAAiB;AACjB,8BAA8B;AAE9B,uBAAuB;AACvB,oBAAoB;AACpB,iCAAiC;AAEjC,uBAAuB;AACvB,oBAAoB;AACpB,iCAAiC;AAEjC,wBAAwB;AACxB,qBAAqB;AACrB,4BAA4B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function mapToViewbox(viewbox, width, height, psss) {
|
|
2
|
+
if (viewbox[0] === 0 && viewbox[1] === 0 &&
|
|
3
|
+
viewbox[2] === width && viewbox[3] === height) {
|
|
4
|
+
return psss;
|
|
5
|
+
}
|
|
6
|
+
const [vx, vy, vw, vh] = viewbox;
|
|
7
|
+
const scaleX = width / vw;
|
|
8
|
+
const scaleY = height / vh;
|
|
9
|
+
const psss_ = [];
|
|
10
|
+
for (let i = 0; i < psss.length; i++) {
|
|
11
|
+
const pss = psss[i];
|
|
12
|
+
const pss_ = [];
|
|
13
|
+
for (let j = 0; j < pss.length; j++) {
|
|
14
|
+
const ps = pss[j];
|
|
15
|
+
const ps_ = [];
|
|
16
|
+
for (let k = 0; k < ps.length; k++) {
|
|
17
|
+
const [x, y] = ps[k];
|
|
18
|
+
const x_ = scaleX * x - vx;
|
|
19
|
+
const y_ = scaleY * y - vy;
|
|
20
|
+
ps_.push([x_, y_]);
|
|
21
|
+
}
|
|
22
|
+
pss_.push(ps_);
|
|
23
|
+
}
|
|
24
|
+
psss_.push(pss_);
|
|
25
|
+
}
|
|
26
|
+
return psss_;
|
|
27
|
+
}
|
|
28
|
+
export { mapToViewbox };
|
|
29
|
+
//# sourceMappingURL=map-to-viewbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-to-viewbox.js","sourceRoot":"","sources":["../../src/utils/map-to-viewbox.ts"],"names":[],"mappings":"AACA,SAAS,YAAY,CACb,OAAsC,EACtC,KAAa,EACb,MAAc,EACd,IAAsB;IAE1B,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACpC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAEhD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC;IAEjC,MAAM,MAAM,GAAG,KAAK,GAAC,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,GAAC,EAAE,CAAC;IACzB,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAmB,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,MAAM,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBAEpB,MAAM,EAAE,GAAG,MAAM,GAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,MAAM,EAAE,GAAG,MAAM,GAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAC,EAAE,CAAC,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAA"}
|