update
Browse files
app/src/components/trackio/renderers/core/interaction-manager.js
CHANGED
|
@@ -205,13 +205,44 @@ export class InteractionManager {
|
|
| 205 |
}
|
| 206 |
|
| 207 |
/**
|
| 208 |
-
* Prepare data for hover tooltip
|
| 209 |
*/
|
| 210 |
prepareHoverData(series, nearestStep, normalizeY, isAccuracy) {
|
| 211 |
const entries = series.map(s => {
|
| 212 |
-
const
|
| 213 |
-
const
|
| 214 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 215 |
}).filter(e => e.pt && e.pt.value != null)
|
| 216 |
.sort((a, b) => a.pt.value - b.pt.value);
|
| 217 |
|
|
|
|
| 205 |
}
|
| 206 |
|
| 207 |
/**
|
| 208 |
+
* Prepare data for hover tooltip with interpolation for missing points
|
| 209 |
*/
|
| 210 |
prepareHoverData(series, nearestStep, normalizeY, isAccuracy) {
|
| 211 |
const entries = series.map(s => {
|
| 212 |
+
const values = s.values.sort((a, b) => a.step - b.step);
|
| 213 |
+
const m = new Map(values.map(v => [v.step, v]));
|
| 214 |
+
let pt = m.get(nearestStep);
|
| 215 |
+
|
| 216 |
+
// If no exact point, interpolate from surrounding points
|
| 217 |
+
if (!pt) {
|
| 218 |
+
// Find the two closest points (one before, one after)
|
| 219 |
+
let before = null;
|
| 220 |
+
let after = null;
|
| 221 |
+
|
| 222 |
+
for (let i = 0; i < values.length; i++) {
|
| 223 |
+
if (values[i].step < nearestStep) {
|
| 224 |
+
before = values[i];
|
| 225 |
+
} else if (values[i].step > nearestStep && !after) {
|
| 226 |
+
after = values[i];
|
| 227 |
+
break;
|
| 228 |
+
}
|
| 229 |
+
}
|
| 230 |
+
|
| 231 |
+
// Interpolate if we have both surrounding points
|
| 232 |
+
if (before && after) {
|
| 233 |
+
const ratio = (nearestStep - before.step) / (after.step - before.step);
|
| 234 |
+
const interpolatedValue = before.value + ratio * (after.value - before.value);
|
| 235 |
+
pt = { step: nearestStep, value: interpolatedValue };
|
| 236 |
+
} else if (before) {
|
| 237 |
+
// Use the last known value
|
| 238 |
+
pt = before;
|
| 239 |
+
} else if (after) {
|
| 240 |
+
// Use the first known value
|
| 241 |
+
pt = after;
|
| 242 |
+
}
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
return { run: s.run, color: s.color, pt, hasExactPoint: !!m.get(nearestStep) };
|
| 246 |
}).filter(e => e.pt && e.pt.value != null)
|
| 247 |
.sort((a, b) => a.pt.value - b.pt.value);
|
| 248 |
|