fix: elevation curve x-axis float precision loss

Absolute epoch millis (~1.7e12) exceeds Float precision (ULP ~131s
at that magnitude), so 5s-spaced samples collapsed onto identical
x coordinates, producing a stepped/jagged curve. Use Long relative
time deltas (sample - start) before converting to Float.
This commit is contained in:
atsunatsu committed 2026-08-02 23:36:59 +08:00
1 parent d7e1ce11c9
commit 4baf3821e5
1 file changed
+4 -4
@@ -104,9 +104,9 @@ fun ElevationCurveChart(
if (plotWidth <= 0f || plotHeight <= 0f) return@Canvas if (plotWidth <= 0f || plotHeight <= 0f) return@Canvas
val minTime = startTime.toFloat() val minTime = startTime
val maxTime = endTime.toFloat() val maxTime = endTime
val timeRange = maxTime - minTime val timeRange = (maxTime - minTime).toFloat()
if (timeRange <= 0f) return@Canvas if (timeRange <= 0f) return@Canvas
// Grid lines // Grid lines
@@ -147,7 +147,7 @@ fun ElevationCurveChart(
val ptsB = mutableListOf<Offset>() val ptsB = mutableListOf<Offset>()
for ((time, elev) in samples) { for ((time, elev) in samples) {
val x = plotLeft + ((time.toFloat() - minTime) / timeRange) * plotWidth val x = plotLeft + ((time - minTime).toFloat() / timeRange) * plotWidth
val yA = plotBottom - ((elev.first.toFloat() / maxElev.toFloat()) * plotHeight).coerceIn(0f, plotHeight) val yA = plotBottom - ((elev.first.toFloat() / maxElev.toFloat()) * plotHeight).coerceIn(0f, plotHeight)
val yB = plotBottom - ((elev.second.toFloat() / maxElev.toFloat()) * plotHeight).coerceIn(0f, plotHeight) val yB = plotBottom - ((elev.second.toFloat() / maxElev.toFloat()) * plotHeight).coerceIn(0f, plotHeight)
ptsA.add(Offset(x, yA)) ptsA.add(Offset(x, yA))