From 406625f7074233b381c3e01de751250d05b04f9d Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Sun, 28 Jul 2024 17:59:10 +0200 Subject: fix: Fix climb finder when climb is not highest --- ride/climb.go | 16 ++++++++++++---- ride/climb_test.go | 7 +++---- 2 files changed, 15 insertions(+), 8 deletions(-) (limited to 'ride') 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])) } -- cgit v1.2.3