aboutsummaryrefslogtreecommitdiff
path: root/web/frontend/analytics-logic.ts
diff options
context:
space:
mode:
Diffstat (limited to 'web/frontend/analytics-logic.ts')
-rw-r--r--web/frontend/analytics-logic.ts35
1 files changed, 35 insertions, 0 deletions
diff --git a/web/frontend/analytics-logic.ts b/web/frontend/analytics-logic.ts
new file mode 100644
index 0000000..7a53944
--- /dev/null
+++ b/web/frontend/analytics-logic.ts
@@ -0,0 +1,35 @@
+export const niceStep = (range: number, target: number): number => {
+ if (range <= 0) return 1;
+ const ideal = range / target;
+ const magnitude = 10 ** Math.floor(Math.log10(ideal));
+ let best = magnitude;
+ let bestDistance = Number.POSITIVE_INFINITY;
+ for (const factor of [1, 2, 5, 10]) {
+ const candidate = factor * magnitude;
+ const distance = Math.abs(candidate - ideal);
+ if (distance < bestDistance) {
+ bestDistance = distance;
+ best = candidate;
+ }
+ }
+ return best;
+};
+
+export const ticks = (min: number, max: number, target = 5): number[] => {
+ const step = niceStep(max - min, target);
+ const values: number[] = [];
+ for (let value = Math.floor(min / step) * step; value <= max + 1e-9; value += step) {
+ if (value >= min - 1e-9) values.push(roundStep(value));
+ }
+ return values;
+};
+
+const roundStep = (value: number): number => {
+ if (!Number.isFinite(value) || value === 0) return 0;
+ const decimals = Math.max(0, -Math.floor(Math.log10(value) + 1e-9));
+ return Number(value.toFixed(decimals));
+};
+
+export const formatSpeed = (speed: number): string => `${speed.toFixed(1)}`;
+
+export const formatCotacol = (cotacol: number): string => (cotacol >= 100 ? `${Math.round(cotacol)}` : `${cotacol.toFixed(1)}`);