summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kagamino Lehoux <martin@lehoux.net>2024-07-28 17:59:10 +0200
committerMartin Kagamino Lehoux <martin@lehoux.net>2024-07-28 17:59:10 +0200
commit406625f7074233b381c3e01de751250d05b04f9d (patch)
tree80946d3621f875fb25501482ee9c620cf86c98e0
parent203b9bdf17bd4742b5aab2c35df47b59af0652f1 (diff)
fix: Fix climb finder when climb is not highest
-rw-r--r--ride/climb.go16
-rw-r--r--ride/climb_test.go7
2 files changed, 15 insertions, 8 deletions
diff --git a/ride/climb.go b/ride/climb.go
index a337a15..bf1dfc9 100644
--- a/ride/climb.go
+++ b/ride/climb.go
@@ -59,7 +59,7 @@ func Category(score float64) string {
}
}
-func bestClimbUntilEnd(points []Point, start int, end int) Climb {
+func bestClimbBetween(points []Point, start int, end int) Climb {
kcore.Assert(end > start, "empty points")
bestScore := Score(points, start, end)
@@ -71,7 +71,15 @@ func bestClimbUntilEnd(points []Point, start int, end int) Climb {
bestScore = score
}
}
- climb := Climb{bestStart, end}
+ bestEnd := end
+ for i := end; i > bestStart; i-- {
+ score := Score(points, bestStart, i)
+ if score > bestScore {
+ bestEnd = i
+ bestScore = score
+ }
+ }
+ climb := Climb{bestStart, bestEnd}
kcore.Assert(climb.start < climb.end, "empty climb")
return climb
@@ -84,7 +92,7 @@ func climbsBetween(points []Point, start int, end int) []Climb {
}
fmt.Printf("Searching climbs between %.1fkm and %.1fkm\n", points[start].distance/1000, points[end].distance/1000)
highest := start
- for i := start; i < end; i++ {
+ for i := start; i <= end; i++ {
if points[i].elevation > points[highest].elevation {
highest = i
}
@@ -93,7 +101,7 @@ func climbsBetween(points []Point, start int, end int) []Climb {
if highest == start {
return climbsBetween(points, start+1, end)
}
- climb := bestClimbUntilEnd(points, start, highest)
+ climb := bestClimbBetween(points, start, highest)
if Score(points, climb.start, climb.end) >= 35 {
fmt.Printf("Found climb between %.1fkm and %.1fkm\n", points[climb.start].distance/1000, points[climb.end].distance/1000)
climbs = append(climbs, climb)
diff --git a/ride/climb_test.go b/ride/climb_test.go
index 5acc3c4..ec74e56 100644
--- a/ride/climb_test.go
+++ b/ride/climb_test.go
@@ -62,9 +62,8 @@ func TestClimbThenFalseFlat(t *testing.T) {
r := RideBuilder{precision: 100}.WithSection("2km at 7%").WithSection("10km at 1%").Build()
climbs := r.AllClimbs()
- assert.Len(t, climbs, 2)
- assert.Equal(t, "0.0km-11.9km: 11.9km at 1.8% (40 pts - Cat 4)", r.String(climbs[0]))
- assert.Equal(t, "", r.String(climbs[1]))
+ assert.Len(t, climbs, 1)
+ assert.Equal(t, "0.0km-2.0km: 2.0km at 7.0% (98 pts - Cat 3)", r.String(climbs[0]))
}
func TestPogacar20220721(t *testing.T) {
@@ -76,7 +75,7 @@ func TestPogacar20220721(t *testing.T) {
assert.Len(t, climbs, 5)
assert.Equal(t, "0.6km-5.6km: 5.0km at 3.5% (62 pts - Cat 4)", r.String(climbs[0]))
assert.Equal(t, "60.0km-76.4km: 16.4km at 7.2% (854 pts - HC)", r.String(climbs[1]))
- assert.Equal(t, "83.8km-85.9km: 2.1km at 5.4% (59 pts - Cat 4)", r.String(climbs[2]))
+ assert.Equal(t, "83.8km-85.9km: 2.0km at 5.4% (59 pts - Cat 4)", r.String(climbs[2]))
assert.Equal(t, "99.2km-109.3km: 10.2km at 8.4% (710 pts - HC)", r.String(climbs[3]))
assert.Equal(t, "128.6km-142.2km: 13.6km at 7.8% (832 pts - HC)", r.String(climbs[4]))
}