-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.ts
87 lines (75 loc) · 2.23 KB
/
utils.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import { CyclicOptionals } from "./2d.js";
import { clamp } from "../helpers.js";
type CyclicCommonSettings = {
segments: number;
points: number;
cycles: number;
steps: number;
xStep: number;
yStep: number;
tOffset: number;
yOffset: number;
phaseSegmentsOffset: number;
withPhaseOffset: boolean;
includeOrigin: boolean;
};
type Steps = {
x: number;
y: number;
};
type CyclicData = {
coords: [number, number][];
steps: Steps;
};
export const getCyclicInitialData = (settings: CyclicCommonSettings): CyclicData => {
const steps: Steps = { x: settings.tOffset, y: settings.yOffset };
const coords: [number, number][] = [];
if (settings.includeOrigin) coords.push([steps.x, steps.y]);
return { steps, coords };
};
export const getCyclicCommonSettings = (
x: number,
y: number,
segments: number,
pointsPerSegment: number,
cycles: number,
optionals: CyclicOptionals | undefined
): CyclicCommonSettings => {
pointsPerSegment = Math.round(pointsPerSegment);
cycles = Math.round(cycles);
const steps = pointsPerSegment - 1;
const xStep = x / steps;
const yStep = y / steps;
const tOffset = optionals?.tOffset ?? 0;
const yOffset = optionals?.yOffset ?? 0;
const phaseSegmentsOffset = clamp(Math.round(optionals?.phaseSegmentsOffset ?? 0), 0, segments);
const includeOrigin = !!optionals?.includeOrigin;
return {
segments,
points: pointsPerSegment,
cycles,
steps,
xStep,
yStep,
tOffset,
yOffset,
phaseSegmentsOffset,
withPhaseOffset: phaseSegmentsOffset > 0 && phaseSegmentsOffset < segments,
includeOrigin,
};
};
export const iterateCycles = (
cycles: number,
settings: CyclicCommonSettings,
handler: (segment: number, step: number) => boolean | void,
phaseOffset = false
): void => {
const firstSeg = phaseOffset ? settings.phaseSegmentsOffset : 0;
for (let cycle = 0; cycle < cycles; cycle++) {
for (let seg = firstSeg; seg < firstSeg + settings.segments; seg++) {
for (let step = 0; step < settings.steps; step++) {
if (handler(seg, step)) return;
}
}
}
};